JavaScript代码parsingCSV数据

有人有一个想法,我可以find一些JavaScript代码parsingCSV数据?

您可以使用此博客条目中提到的CSVToArray()函数。

<script type="text/javascript"> // ref: http://stackoverflow.com/a/1293163/2343 // This will parse a delimited string into an array of // arrays. The default delimiter is the comma, but this // can be overriden in the second argument. function CSVToArray( strData, strDelimiter ){ // Check to see if the delimiter is defined. If not, // then default to comma. strDelimiter = (strDelimiter || ","); // Create a regular expression to parse the CSV values. var objPattern = new RegExp( ( // Delimiters. "(\\" + strDelimiter + "|\\r?\\n|\\r|^)" + // Quoted fields. "(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" + // Standard fields. "([^\"\\" + strDelimiter + "\\r\\n]*))" ), "gi" ); // Create an array to hold our data. Give the array // a default empty first row. var arrData = [[]]; // Create an array to hold our individual pattern // matching groups. var arrMatches = null; // Keep looping over the regular expression matches // until we can no longer find a match. while (arrMatches = objPattern.exec( strData )){ // Get the delimiter that was found. var strMatchedDelimiter = arrMatches[ 1 ]; // Check to see if the given delimiter has a length // (is not the start of string) and if it matches // field delimiter. If id does not, then we know // that this delimiter is a row delimiter. if ( strMatchedDelimiter.length && strMatchedDelimiter !== strDelimiter ){ // Since we have reached a new row of data, // add an empty row to our data array. arrData.push( [] ); } var strMatchedValue; // Now that we have our delimiter out of the way, // let's check to see which kind of value we // captured (quoted or unquoted). if (arrMatches[ 2 ]){ // We found a quoted value. When we capture // this value, unescape any double quotes. strMatchedValue = arrMatches[ 2 ].replace( new RegExp( "\"\"", "g" ), "\"" ); } else { // We found a non-quoted value. strMatchedValue = arrMatches[ 3 ]; } // Now that we have our value string, let's add // it to the data array. arrData[ arrData.length - 1 ].push( strMatchedValue ); } // Return the parsed data. return( arrData ); } </script> 

我想我可以充分打败Kirtan的答案

inputjQuery-CSV

这是一个jquery插件,被devise成一个端到端解决scheme,用于将CSVparsing为Javascript数据。 它处理RFC 4180中提出的每一个边缘情况,以及一些popupExcel / Google Spreadsheed导出(即大部分涉及空值)的规范缺失的情况。

例:

曲目,艺术家,专辑,年份

危险的,“布斯塔韵”,“当灾难袭击”,1997年

 // calling this music = $.csv.toArrays(csv) // outputs... [ ["track","artist","album","year"], ["Dangerous","Busta Rhymes","When Disaster Strikes","1997"] ] console.log(music[1][2]) // outputs: 'When Disaster Strikes' 

更新:

噢,我也应该提到它是完全可configuration的。

 music = $.csv.toArrays(csv, { delimiter:"'", // sets a custom value delimiter character separator:';', // sets a custom field separator character }); 

更新2:

它现在也适用于Node.js上的jQuery。 因此,您可以select使用相同的库进行客户端或服务器端parsing。

更新3:

自Google Codeclosures以来, jquery-csv已经迁移到GitHub 。

免责声明:我也是jQuery-CSV的作者。

我有一个实现作为电子表格项目的一部分。

此代码尚未完全testing,但欢迎任何人使用它。

正如其中一些答案所指出的那样,如果您实际上拥有DSV或TSV文件,那么您的实现可能会简单得多,因为它们不允许在值中使用logging和字段分隔符。 另一方面,CSV实际上可以在字段中包含逗号和换行符,这打破了大多数正则expression式和基于分割的方法。

 var CSV = { parse: function(csv, reviver) { reviver = reviver || function(r, c, v) { return v; }; var chars = csv.split(''), c = 0, cc = chars.length, start, end, table = [], row; while (c < cc) { table.push(row = []); while (c < cc && '\r' !== chars[c] && '\n' !== chars[c]) { start = end = c; if ('"' === chars[c]){ start = end = ++c; while (c < cc) { if ('"' === chars[c]) { if ('"' !== chars[c+1]) { break; } else { chars[++c] = ''; } // unescape "" } end = ++c; } if ('"' === chars[c]) { ++c; } while (c < cc && '\r' !== chars[c] && '\n' !== chars[c] && ',' !== chars[c]) { ++c; } } else { while (c < cc && '\r' !== chars[c] && '\n' !== chars[c] && ',' !== chars[c]) { end = ++c; } } row.push(reviver(table.length-1, row.length, chars.slice(start, end).join(''))); if (',' === chars[c]) { ++c; } } if ('\r' === chars[c]) { ++c; } if ('\n' === chars[c]) { ++c; } } return table; }, stringify: function(table, replacer) { replacer = replacer || function(r, c, v) { return v; }; var csv = '', c, cc, r, rr = table.length, cell; for (r = 0; r < rr; ++r) { if (r) { csv += '\r\n'; } for (c = 0, cc = table[r].length; c < cc; ++c) { if (c) { csv += ','; } cell = replacer(r, c, table[r][c]); if (/[,\r\n"]/.test(cell)) { cell = '"' + cell.replace(/"/g, '""') + '"'; } csv += (cell || 0 === cell) ? cell : ''; } } return csv; } }; 

这里有一个非常简单的CSVparsing器,用逗号,换行符和转义双引号处理带引号的字段。 没有分裂或RegEx。 它一次扫描input的string1-2个字符并构build一个数组。

http://jsfiddle.net/vHKYH/testing。;

 function parseCSV(str) { var arr = []; var quote = false; // true means we're inside a quoted field // iterate over each character, keep track of current row and column (of the returned array) for (var row = col = c = 0; c < str.length; c++) { var cc = str[c], nc = str[c+1]; // current character, next character arr[row] = arr[row] || []; // create a new row if necessary arr[row][col] = arr[row][col] || ''; // create a new column (start with empty string) if necessary // If the current character is a quotation mark, and we're inside a // quoted field, and the next character is also a quotation mark, // add a quotation mark to the current column and skip the next character if (cc == '"' && quote && nc == '"') { arr[row][col] += cc; ++c; continue; } // If it's just one quotation mark, begin/end quoted field if (cc == '"') { quote = !quote; continue; } // If it's a comma and we're not in a quoted field, move on to the next column if (cc == ',' && !quote) { ++col; continue; } // If it's a newline (CRLF) and we're not in a quoted field, skip the next character // and move on to the next row and move to column 0 of that new row if (cc == '\r' && nc == '\n' && !quote) { ++row; col = 0; ++c; continue; } // If it's a newline (LF or CR) and we're not in a quoted field, // move on to the next row and move to column 0 of that new row if (cc == '\n' && !quote) { ++row; col = 0; continue; } if (cc == '\r' && !quote) { ++row; col = 0; continue; } // Otherwise, append the current character to the current column arr[row][col] += cc; } return arr; } 

这里是我的PEG(.js)语法,似乎在RFC 4180上可以正常工作(即它在http://en.wikipedia.org/wiki/Comma-separated_values处理示例):;

 start = [\n\r]* first:line rest:([\n\r]+ data:line { return data; })* [\n\r]* { rest.unshift(first); return rest; } line = first:field rest:("," text:field { return text; })* & { return !!first || rest.length; } // ignore blank lines { rest.unshift(first); return rest; } field = '"' text:char* '"' { return text.join(''); } / text:[^\n\r,]* { return text.join(''); } char = '"' '"' { return '"'; } / [^"] 

试试http://jsfiddle.net/knvzk/10或http://pegjs.majda.cz/online 。 在https://gist.github.com/3362830下载生成的parsing器。;

csvToArray v1.3

符合RFC4180标准的紧凑(645字节)但兼容的function,可将CSVstring转换为二维数组。

http://code.google.com/p/csv-to-array/

常用用法:jQuery

  $.ajax({ url: "test.csv", dataType: 'text', cache: false }).done(function(csvAsString){ csvAsArray=csvAsString.csvToArray(); }); 

常用用法:Javascript

 csvAsArray = csvAsString.csvToArray(); 

覆盖字段分隔符

 csvAsArray = csvAsString.csvToArray("|"); 

覆盖logging分隔符

 csvAsArray = csvAsString.csvToArray("", "#"); 

覆盖跳过标题

 csvAsArray = csvAsString.csvToArray("", "", 1); 

覆盖全部

 csvAsArray = csvAsString.csvToArray("|", "#", 1); 

我不知道为什么我不能kirtans前。 为我工作。 它似乎是空的领域或拖尾逗号字段失败…

这一个似乎处理两个。

我没有编写parsing器代码,只是parsing器函数的一个包装,以使其对文件起作用。 请参阅归因

  var Strings = { /** * Wrapped csv line parser * @param s string delimited csv string * @param sep separator override * @attribution : http://www.greywyvern.com/?post=258 (comments closed on blog :( ) */ parseCSV : function(s,sep) { // http://stackoverflow.com/questions/1155678/javascript-string-newline-character var universalNewline = /\r\n|\r|\n/g; var a = s.split(universalNewline); for(var i in a){ for (var f = a[i].split(sep = sep || ","), x = f.length - 1, tl; x >= 0; x--) { if (f[x].replace(/"\s+$/, '"').charAt(f[x].length - 1) == '"') { if ((tl = f[x].replace(/^\s+"/, '"')).length > 1 && tl.charAt(0) == '"') { f[x] = f[x].replace(/^\s*"|"\s*$/g, '').replace(/""/g, '"'); } else if (x) { f.splice(x - 1, 2, [f[x - 1], f[x]].join(sep)); } else f = f.shift().split(sep).concat(f); } else f[x].replace(/""/g, '"'); } a[i] = f; } return a; } } 

为什么不使用.split(',')?

http://www.w3schools.com/jsref/jsref_split.asp

 var str="How are you doing today?"; var n=str.split(" ");