JavaScript 是否有一个不错的 CSV Parser 库?到目前为止,我已经使用了 this 和 that 解决方案。在第一个解决方案中,永远不会将新行创建为新的子数组,代码也会这样说,第二个解决方案对Windows 格式为的文本文件不起作用 <CR><LF>
,分别为\r\n
是否足以申请
text = text.replace("\r","");
到Windows CSV文件?这实际上有效,但我认为这有点怪癖。是否有比随机博客解决方案更常见的csv解析器?
答案 0 :(得分:4)
这是'简单'解决方案
csv.split(/\r\n|\r|\n/g)
它处理:
不幸的是,它打破了在分隔符之间包含换行符的值。
例如,以下行条目......
"this is some","valid CSV data","with a \r\nnewline char"
会破坏它,因为'\ r \ n'会被错误地解释为条目的结尾。
要获得完整的解决方案,最好的办法是创建一个ND-FSM(非确定性有限状态机)词法分析器/解析器。如果您听说过Chomsky Hierarchy,则可以将CSV解析为Type III语法。这意味着使用状态跟踪进行char-by-char或token-by-token处理。
我有一个完全RFC 4180兼容的客户端库可用,但不知何故,我引起了一个删除快乐模式的外部链接的注意。如果您有兴趣,我的个人资料中会有链接;祝你好运。
我会从经验中给你一个公平的警告,表面看起来很简单。在研究了数十/数百个实现之后,我只看到了3个javascript解析器,它们完全符合规范,并且没有一个完全符合RFC。我设法写了一个,但只是在社区的帮助下,还有很多痛苦。
答案 1 :(得分:2)
如果您在Node中工作,那么可以处理极其庞大的数据(&gt; GB文件)并支持转义字符的优秀CSV parser。
如果您在浏览器JS中工作,您仍然可以从code中提取处理逻辑,以便它对字符串(而不是节点Stream
)进行操作。
答案 2 :(得分:2)
这是一种方法:
// 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;
};
}();
答案 3 :(得分:0)
我的功能很扎实,只需投入使用,希望对您有所帮助。
csvToArray v1.3
紧凑(508字节)但兼容的功能,可将CSV字符串转换为2D数组,符合RFC4180标准。
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);