JavaScript的CSV分析器库

有没有一个像样的JavaScript parsingJavaScript parsing器库? 到目前为止我已经使用过这个那个解决scheme 在第一个解决scheme中,新行不会被创build为新的子数组,代码也是如此,而第二个解决scheme对Windows中格式化为<CR><LF>文本文件不起作用\r\n

这是足够的申请

 text = text.replace("\r",""); 

到Windows CSV文件? 这实际上是有效的,但我觉得这有点怪癖。 有没有比随机博客解决scheme更常见的csvparsing器?

这是'简单'的解决方案

 csv.split(/\r\n|\r|\n/g) 

它处理:

  • \ n
  • \ r
  • \ r \ n
  • \ n \ r

不幸的是,它打破了在分隔符之间包含换行符的值。

例如,下面的行条目…

 "this is some","valid CSV data","with a \r\nnewline char" 

将打破它,因为\ r \ n将被错误地解释为一个条目的结束。

对于一个完整的解决方案,最好的办法是创建一个ND-FSM(非确定性有限状态机)词法分析器。 如果你曾经听说过Chomsky Hierarchy ,CSV可以被解析为Type III语法。 这意味着逐个字符或逐个令牌地处理状态跟踪。

我有一个完全符合RFC 4180的客户端库,但不知何故,我吸引了外部链接的删除快乐国防部的注意力。 如果你有兴趣,我的个人资料中有一个链接。 否则,祝你好运。

我会从经验中给你公正的警告,CSV看起来似乎很容易。 在学习了数十个实现之后,我只看到了三个JavaScript解析器,它们完成了符合规范的合理工作,而且没有一个完全符合RFC。 我设法写一个,但只有在社区的帮助下,还有很多很多的痛苦

如果你在Node中工作,那么有一个很好的CSV解析器可以处理大量的数据(> GB文件),并支持转义字符。

如果您使用的是浏览器JS,那么您仍然可以从代码中提取处理逻辑,以便在字符串(而不是节点Stream )上运行。

这是一个办法:

 // based on json_parse from JavaScript The Good Part by D. Crockford var csv_parse = function () { var at, ch, text, error = function (m) { throw { name: 'SyntaxError', message: m, at: at, text: text }; }, next = function (c) { if (c && c !== ch) { error("Expected '" + c + "' instead of '" + ch + "'"); } ch = text.charAt(at); at += 1; return ch; }, //needed to handle "" which indicates escaped quote peek = function () { return text.charAt(at); }, white = function () { while (ch && ch <= ' ' && ch !== '\n') { next(); } }, // if numeric, then return number number = function () { var number, string = word(); number = +string; if (isNaN(number)) { return string; } else { return number; } }, word = function () { var string = ''; while (ch !== ',' && ch !== '\n') { string += ch; next(); } return string; }, // the matching " is the end of word not , // need to worry about "", which is escaped quote quoted = function () { var string =''; if (ch === '"') { while (next()) { if (ch === '"') { //print('need to know ending quote or escaped quote'); // need to know ending quote or escaped quote ("") if (peek() === '"') { //print('maybe double quote near '+string); next('"'); string += ch; } else { next('"') return string; } } else { string += ch; } } return string; } error("Bad string"); }, value = function () { white(); switch(ch) { case '-': return number(); case '"': return quoted(); default: return ch >= '0' && ch <= '9' ? number() : word(); } return number(); }, line = function () { var array = []; white(); if (ch === '\n') { next('\n'); return array;//empty [] } while (ch) { array.push( value() ); white(); if (ch === '\n') { next('\n'); return array;//got something } next(',');// not very liberal with delimiter white(); } }; return function (_line) { var result; text = _line; at = 0; ch = ' '; result = line(); white(); if (ch) { error("Syntax error"); } return result; }; }(); 

我的功能很扎实,只要放下就用,希望对你有帮助。

csvToArray v1.3

符合RFC4180标准的紧凑(508字节)但兼容功能,可将CSV字符串转换为二维数组。

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("|"); 

覆盖记录分隔符

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

覆盖跳过标题

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

覆盖全部

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