js-csvparser
Version:
Fast and feature rich CSV parser with great auto detection for line ending and delimiter.
1 lines • 7.53 kB
JavaScript
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):e.CSVParser=n()}(this,function(){"use strict";function e(e,n){return new Date(Date.UTC(e,n+1,0)).getUTCDate()}function n(n,t,r,i,u,l){return t&&(0>t||t>11)?!0:r&&(0>r||r>e(n,t))?!0:i&&(0>i||i>24||24===i&&(0!==u||0!==l))?!0:u&&(0>u||u>59)?!0:!(!l||!(0>l||l>59))}function t(e){return Number(e)+(Number(e)>68?1900:2e3)}function r(e){return i(e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(e,n,t,r,i){return n||t||r||i}))}function i(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function u(e,n){return"NaD"!==l(e,n)}function l(e,i){e=""+e;for(let u,l=/(\[[^\[]*\])|(\\)?(yyyy|yy|mm|m|dd|d|HH|H|MM|M|SS|S|.)/g,m=i.match(l)||[],s=0,d=0,o=0,a=null,f=null,y=null,g=0;g<m.length;g++){let h=m[g];u="d"===h||"m"===h||"H"===h||"M"===h||"S"===h?/\d\d?/:"dd"===h||"mm"===h||"yy"===h||"HH"===h||"MM"===h||"SS"===h?/\d\d/:"yyyy"===h?/\d{4}/:new RegExp(r(h));let p=(e.match(u)||[])[0];if(p){let c=e.substr(0,e.indexOf(p));if(c.length>0)return"NaD";e=e.slice(e.indexOf(p)+p.length),"S"===h||"SS"===h?s=Number(p):"M"===h||"MM"===h?d=Number(p):"H"===h||"HH"===h?o=Number(p):"d"===h||"dd"===h?a=Number(p):"m"===h||"mm"===h?f=Number(p)-1:"yy"===h?y=t(p):"yyyy"===h&&(y=2===p.length?t(p):Number(p))}}return null===y||null===f||null===a||n(y,f,a,o,d,s)?"NaD":new Date(Date.UTC(y,f,a,o,d,s))}function m(e){e=e.trim();let n=e.split(",").length-1;if(n>1)return".";if(e.indexOf(" ")>=0)return",";if(e.indexOf("،")>=0)return".";if(e.indexOf("'")>=0)return".";let t=e.split(".").length-1;if(1===n&&1===t){let r=e.lastIndexOf(","),i=e.lastIndexOf(".");return i>r?".":","}if(n+t===1){let r=e.indexOf(","),i=e.indexOf("."),u=e.length;if(-1!==r&&u-r!==4)return",";if(-1!==i&&u-i!==4)return"."}return"ambiguous"}function s(e){for(let n=0;n<e.length;n++)for(let t=0;t<e[n].length;t++)if(/^[0-9.,' ،-]+$/.test(e[n][t])){let r=m(e[n][t]);if("ambiguous"!==r)return r}return"."}function d(e,n){for(let t in n)"object"==typeof n[t]?"undefined"!=typeof e[t]&&d(e[t],n[t]):e[t]=n[t];return e}function o(e,n){function t(t){return!!(0===t||e[t-1]===n.lineEnding||t>1&&"\r\n"===n.lineEnding&&"\r"===e[t-2]&&"\n"===e[t-1])}function r(t){for(;t!==m&&e[t]!==n.lineEnding&&("\r\n"!==n.lineEnding||"\r"!==e[t]||"\n"!==e[t+1]);t++);return t}let i={delimiter:",",lineEnding:"\n",comment:"#",maxRows:0,maxColumns:{numberOfColumns:-1,cutRemaining:!1}};n=d(i,n);let u=[],l=[],m=e.length;if(0===m)return u;e:for(let s=0,o=0,a=0,f=0;;o++){if(o>=m){l.push(e.substring(s,o)),l.length>0&&u.push(l);break}if(e[o]!==n.delimiter){if(e[o]===n.lineEnding||"\r\n"===n.lineEnding&&"\r"===e[o]&&"\n"===e[o+1]){if(l.push(e.substring(s,o)),u.push(l),l=[],f=0,a++,a===n.maxRows)break;"\r\n"===n.lineEnding&&(o+=1),s=o+1}else if(t(o)&&e[o]===n.comment){if(o=r(o),o===m)break;"\r\n"===n.lineEnding&&(o+=1),s=o+1}else if('"'===e[o])if(t(o)||e[o-1]===n.delimiter)for(s=o+=1;;o++){if(o===m){l.push(e.substring(s,o)),u.push(l);break e}if('"'===e[o]){if(o===m-1){l.push(e.substring(s,o).replace(/""/g,'"')),u.push(l);break e}if('"'===e[o+1]){o+=1;continue}if(e[o+1]===n.delimiter){if(f++,f===n.maxColumns.numberOfColumns){if(n.maxColumns.cutRemaining?(l.push(e.substring(s,o).replace(/""/g,'"')),o=r(o)):(o=r(o),l.push(e.substring(s,'"'===e[o-1]?o-1:o).replace(/""/g,'"').replace(/","/g,","))),u.push(l),l=[],f=0,a++,o===m||a===n.maxRows)break e;"\r\n"===n.lineEnding&&(o+=1)}else l.push(e.substring(s,o).replace(/""/g,'"')),o+=1;s=o+1;break}if(e[o+1]===n.lineEnding||"\r\n"===n.lineEnding&&"\r"===e[o+1]&&"\n"===e[o+2]){if(l.push(e.substring(s,o).replace(/""/g,'"')),u.push(l),l=[],f=0,a++,a===n.maxRows)break e;"\r\n"===n.lineEnding&&(o+=1),o+=1,s=o+1;break}}}else if(e[o+1]===n.delimiter||o===m-1){if(o+=1,f++,f===n.maxColumns.numberOfColumns){if(n.maxColumns.cutRemaining?(l.push(e.substring(s,o)),o=r(o)):(o=r(o),l.push(e.substring(s,o))),u.push(l),l=[],f=0,a++,o===m||a===n.maxRows)break;"\r\n"===n.lineEnding&&(o+=1)}else l.push(e.substring(s,o));s=o+1;continue}}else{if(f++,f===n.maxColumns.numberOfColumns){if(n.maxColumns.cutRemaining?(l.push(e.substring(s,o)),o=r(o)):(o=r(o),l.push(e.substring(s,o))),u.push(l),l=[],f=0,a++,o===m||a===n.maxRows)break;"\r\n"===n.lineEnding&&(o+=1)}else l.push(e.substring(s,o));s=o+1}}return u}function a(e,n){for(let t=[",",";"," ","|",h,p],r=[],i=0;i<t.length;i++){for(let u=o(e,{delimiter:t[i],lineEnding:n,maxRows:10}),l=0,m=0,s=1e3,d=!1,a=!1,f=0;f<u.length;f++)if(""!==u[f]){let y=u[f].length;l+=y,d||(d=!0,m=u[f].length),a||(a=!0,s=Math.abs(m-y))}r.push([m,s,l,i])}return r.sort(function(e,n){let t=e[0],r=n[0],i=e[1],u=n[1],l=e[2],m=n[2];return r>t?1:t>r?-1:u>i?-1:i>u?1:m>l?1:l>m?-1:0}),t[r[0][3]]}function f(e){e=e.substr(0,1048576),e=e.replace(/"[^"]*"/g,"");let n=e.split("\n"),t=e.split("\r"),r=e.split("\r\n"),i=[{type:"\n",data:n,length:n.length-r.length},{type:"\r",data:t,length:t.length-r.length},{type:"\r\n",data:r,length:r.length-1}];return i.sort(function(e,n){return n.length-e.length}),0==i[0].length?"\n":i[0].length==i[1].length?i[0].data[0].length<=i[1].data[0].length?i[0].type:i[1].type:i[0].type}function y(e,n){let t={delimiter:"auto",lineEnding:"auto",comment:"#",convertToTypes:{convert:!1,decimalDelimiter:"auto",dateFormat:"yyyy-mm-dd"},skipEmptyLines:!1,maxRows:0,maxColumns:{numberOfColumns:-1,cutRemaining:!1},header:"auto"};n=d(t,n),"auto"===n.lineEnding&&(n.lineEnding=f(e)),"auto"===n.delimiter&&(n.delimiter=a(e,n.lineEnding));let r=o(e,n);if(n.skipEmptyLines)for(let i=0;i<r.length;i++)1===r[i].length&&""===r[i][0]&&r.splice(i--,1);if(n.convertToTypes.convert){"auto"===n.convertToTypes.decimalDelimiter&&(n.convertToTypes.decimalDelimiter=s(r));let m;m="."===n.convertToTypes.decimalDelimiter?/[,' ،]/g:/[\.' ،]/g;for(let i=0;i<r.length;i++)for(let y=0;y<r[i].length;y++){let h=r[i][y];"true"===h||"TRUE"===h?r[i][y]=!0:"false"===h||"FALSE"===h?r[i][y]=!1:u(h,n.convertToTypes.dateFormat)?r[i][y]=l(h,n.convertToTypes.dateFormat):/[0-9]{2}\.[0-9]{2}\./.test(h)||(h=h.replace(m,""),h=h.replace(n.convertToTypes.decimalDelimiter,"."),h.endsWith("-")&&(h="-"+h.substring(0,h.length-1)),""===h||isNaN(Number(h))||(r[i][y]=Number(h)))}}let p=[];if(1===r.length&&(n.header=0),"auto"===n.header){for(let c=[],b=0,i=0,y=0;i<r.length;i++){if(0===i&&(b=r[i].length),r[i].length===b){for(let x=[],y=0;y<r[i].length;y++)x.push(r[i][y]);c.push(x),y++}if(20==y)break}if(!n.convertToTypes.convert)for(let m=/[,' ،.]/g,i=0;i<c.length;i++)for(let y=0;y<c[i].length;y++){let h=c[i][y];"true"===h||"TRUE"===h?c[i][y]=!0:"false"===h||"FALSE"===h?c[i][y]=!1:/[0-9]{2}\.[0-9]{2}\./.test(h)||(h=g(h),h.date?c[i][y]=h.value:(h=h.value,h=h.replace(m,""),h.endsWith("-")&&(h="-"+h.substring(0,h.length-1)),""===h||isNaN(Number(h))||(c[i][y]=Number(h))))}for(let E=0,T=c.length,C=T?c[0].length:0,N=0,i=0;C>i;i++){for(let v=0,R=0,y=0;T>y;y++){if("string"!=typeof c[y][i]){R+=1;break}v+=1}v>0&&v!==T&&(N+=1,E+=v)}N&&(E/=N),E=Math.round(E),n.header=E}return n.header&&(n.header===!0&&(n.header=1),p=r.slice(0,n.header),r.splice(0,n.header)),{options:n,data:r,header:p}}function g(e){let n=["dd.mm.yy","d.m.yy","dd.mm.yyyy","d.m.yyyy","dd/mm/yy","d/m/yy","dd/mm/yyyy","d/m/yyyy","dd-mm-yy","d-m-yy","dd-mm-yyyy","d-m-yyyy","yyyy-mm-dd","yy-mm-dd","yyyy/mm/dd","yy/mm/dd","yyyy mm dd","mm/dd/yy","m/d/yy","mm/dd/yyyy","m/d/yyyy"];for(let t of n)if(u(e,t))return{date:!0,value:l(e,t)};return{date:!1,value:e}}const h=String.fromCharCode(30),p=String.fromCharCode(31);return y});