我使用NodeJS来传输csv文件,需要处理每一行。我还没有找到一个节点csv解析器模块,它正确支持双引号中的换行符。
因此我使用的是this post模块,需要一个正则表达式来分割,它会在引号中找到仅换行符而不是。
/(\r?\n)/
之类的内容会找到换行符,但如何在双引号字符串中省略换行符?
示例输入(注意第二行中的换行符):
1,2,3,"foo bar baz",4,5
2,2,3,"foo bar
baz",4,5
3,2,3,"foo bar baz",4,5
inputCsvStream.pipe(split(/regex-for-newline-not-in-quotes/)).on('data', (line) => {
// do something with proper csv line
});
谢谢!
答案 0 :(得分:1)
您可以使用CSV Parse
包代替split
,而不是var parse = require('csv-parse');
//...
inputCsvStream.pipe(parse).on('data', (line) => {
// do something with proper csv line
});
:
split
如果您真的希望坚持inputCsvStream.pipe(split(/(.*?(?:"[^"]*"*.*?)*)\r?\n/)).on('data', (line) => {
// ignore the empty lines between the "delimiters"
if (!line.length) return;
// do something with proper csv line
});
用于此目的,您可以使用在拆分结果中包含的功能,即捕获组中分隔符的一部分:
split
这将采用外括号之间的部分(在正则表达式中)并将其添加到管道结果中。显然getLocation()
也管道分隔符之间的部分,在这种情况下,它们总是空字符串。所以这些需要在分裂后明确消除。
答案 1 :(得分:0)
至少fast-csv
支持此:
const csv = require('fast-csv');
csv.fromString(`\
1,2,3,"foo bar baz",4,5
2,2,3,"foo bar
baz",4,5
3,2,3,"foo bar baz",4,5
`).on('data', (d) => {
console.log(d);
});
输出:
[ '1', '2', '3', 'foo bar baz', '4', '5' ]
[ '2', '2', '3', 'foo bar \nbaz', '4', '5' ]
[ '3', '2', '3', 'foo bar baz', '4', '5' ]
答案 2 :(得分:-1)