Fast and powerful CSV (delimited text) parser that gracefully handles large files and malformed input
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

6 lines
7.0 KiB

/*
Papa Parse
v2.1.1
https://github.com/mholt/jquery.parse
*/
;(function(e){"use strict";function t(e){return typeof e==="function"}function n(e,t){function a(n){var r=s+n.target.result;s="";if(r>=t.chunkSize){var u=r.lastIndexOf("\n");if(u<0)u=r.lastIndexOf("\r");if(u>-1){s=r.substring(u+1);r=r.substring(0,u)}}var a=o.parse(r);if(i>=e.size)return f(n);else if(a.errors.abort)return;else c()}function f(n){if(typeof t.onComplete==="function")t.onComplete(undefined,e,t.inputElem,n)}function l(){if(typeof t.onFileError==="function")t.onFileError(u.error,e,t.inputElem)}function c(){if(i<e.size){u.readAsText(e.slice(i,Math.min(i+t.chunkSize,e.size)),t.config.encoding);i+=t.chunkSize}}if(!t)t={};if(!t.chunkSize)t.chunkSize=1024*1024*5;if(t.config.step){var n=t.config.step;t.config.step=function(r){return n(r,e,t.inputElem)}}var i=0;var s="";var o=new r(t.config);var u=new FileReader;u.onload=a;u.onerror=l;this.stream=function(e,n){t.onComplete=e;t.onFileError=n;c()};}function r(e){function c(e){if(typeof e!=="object")e={};if(typeof e.delimiter!=="string"||e.delimiter.length!=1)e.delimiter=f.delimiter;if(e.deimiter=='"'||e.delimiter=="\n")e.delimiter=f.delimiter;if(typeof e.header!=="boolean")e.header=f.header;if(typeof e.dynamicTyping!=="boolean")e.dynamicTyping=f.dynamicTyping;if(typeof e.preview!=="number")e.preview=f.preview;if(typeof e.step!=="function")e.step=f.step;return e}function h(e){var t=String.fromCharCode(30);var n=String.fromCharCode(31);var i=[","," ","|",";",t,n];var s,o,a;for(var f=0;f<i.length;f++){var l=i[f];var c=0,h=0;var p=(new r({delimiter:l,header:false,dynamicTyping:false,preview:10})).parse(e);for(var d=0;d<p.results.length;d++){var v=p.results[d].length;h+=v;if(typeof a==="undefined"){a=v;continue}else if(v>1){c+=Math.abs(v-a);a=v}}h/=p.results.length;if((typeof o==="undefined"||c<o)&&h>1.99){o=c;s=l}}u.delimiter=s;return!!s}function p(){var e=a.i>0&&g(a.i-1)||a.i==0;var t=a.i<i.length-1&&g(a.i+1)||a.i==i.length-1;var n=a.i<i.length-1&&i[a.i+1]=='"';if(a.inQuotes&&n){a.fieldVal+='"';a.i++}else if(e||t)a.inQuotes=!a.inQuotes;else C("Quotes","UnexpectedQuotes","Unexpected quotes")}function d(){v()}function v(){a.fieldVal+=a.ch}function m(){if(a.ch==u.delimiter)b();else if(a.ch=="\r"&&a.i<i.length-1&&i[a.i+1]=="\n"||a.ch=="\n"&&a.i<i.length-1&&i[a.i+1]=="\r"){w();a.i++}else if(a.ch=="\n"||a.ch=="\r")w();else v()}function g(e){if(e>=i.length)return false;var t=i[e];if(t==u.delimiter||t=="\n"||t=="\r"&&e<i.length-1&&i[e+1]=="\n")return true;else return false}function y(e){if(e>=i.length)return false;if(e<i.length-1)return i[e]=="\n"||i[e]=="\r"&&i[e+1]=="\n";else return i[e]=="\n"}function b(){if(u.header){if(a.lineNum==1&&n==1)a.parsed.fields.push(a.fieldVal);else{var e=a.parsed.rows[a.parsed.rows.length-1];var t=a.parsed.fields[a.field];if(t){if(u.dynamicTyping)a.fieldVal=x(a.fieldVal);e[t]=a.fieldVal}else{if(typeof e.__parsed_extra==="undefined")e.__parsed_extra=[];e.__parsed_extra.push(a.fieldVal)}}}else{if(u.dynamicTyping)a.fieldVal=x(a.fieldVal);a.parsed[a.parsed.length-1].push(a.fieldVal)}a.fieldVal="";a.field++}function w(){E();if(S()){a.errors={};a.errors.length=0}if(u.header){if(a.lineNum>0){if(S())a.parsed.rows=[{}];else a.parsed.rows.push({})}}else{if(S())a.parsed=[[]];else if(!u.header)a.parsed.push([])}a.lineNum++;a.line="";a.field=0}function E(){if(o)return;b();var e=T();if(!e&&u.header)N();if(S()&&(!u.header||u.header&&a.parsed.rows.length>0)){var t=u.step(k());if(t===false)o=true}}function S(){return typeof u.step==="function"}function x(e){var t=l.floats.test(e);return t?parseFloat(e):e}function T(){if(l.empty.test(a.line)){if(u.header){if(a.lineNum==1){a.parsed.fields=[];a.lineNum--}else a.parsed.rows.splice(a.parsed.rows.length-1,1)}else a.parsed.splice(a.parsed.length-1,1);return true}return false}function N(){if(!u.header)return true;if(a.parsed.rows.length==0)return true;var e=a.parsed.fields.length;var t=0;var n=a.parsed.rows[a.parsed.rows.length-1];for(var r in n)if(n.hasOwnProperty(r))t++;if(t<e)return C("FieldMismatch","TooFewFields","Too few fields: expected "+e+" fields but parsed "+t);else if(t>e)return C("FieldMismatch","TooManyFields