问题描述
我有一个包含文件中CSV数据的长字符串。 我想将它存储在JavaScript Array of Arrays中。 但是一列中有任意文本。 该文本可能包含双引号和逗号。
将CSV字符串拆分为单独的行字符串是没有问题的:
var theRows = theCsv.split(/\\r?\\n/);
但那我怎么能最好地划分每一行呢?
由于它是CSV数据,我需要用逗号分割。 但
var theArray = new Array();
for (var i=0, i<theRows.length; i++) {
theArray[i] = theRows[i].split(',');
}
不适用于包含引号和逗号的元素,如下例所示:
512,"""Fake News"" and the ""Best Way"" to deal with A, B, and C", 1/18/2019,media
如何确保第二个元素正确存储在单个数组元素中
"Fake News" and the "Best Way" to deal with A, B, and C
谢谢。
不幸的是,当我在那里尝试CSVtoArray函数时,看起来类似的建议解决方案不起作用。 而不是返回数组元素,返回null值,如下面的评论中所述。
1楼
MaximeW
2
已采纳
2019-02-25 09:51:49
这应该这样做:
let parseRow = function(row) {
let isInQuotes = false;
let values = [];
let val = '';
for (let i = 0; i < row.length; i++) {
switch (row[i]) {
case ',':
if (isInQuotes) {
val += row[i];
} else {
values.push(val);
val = '';
}
break;
case '"':
if (isInQuotes && i + 1 < row.length && row[i+1] === '"') {
val += '"';
i++;
} else {
isInQuotes = !isInQuotes
}
break;
default:
val += row[i];
break;
}
}
values.push(val);
return values;
}
它将返回数组中的值:
parseRow('512,"""Fake News"" and the ""Best Way"" to deal with A, B, and C", 1/18/2019,media');
// => ['512', '"Fake News" and the "Best Way" to deal with A, B, and C', ' 1/18/2019', 'media']
要获取所请求的数组数组,您可以执行以下操作:
let parsedCsv = theCsv.split(/\r?\n/).map(parseRow);
说明
代码可能看起来有点模糊。
但主要思想如下:我们按字符解析字符串。
当我们遇到"我们设置isInQuotes = true 。这将改变解析的行为,和"" 。当我们遇到一个"我们再次设置isInQuotes = false时。