我有一个解析csv文件的应用程序。我使用socket.io-client模块,它基本上工作正常。但是,一旦csv文件中存在错误的行,整个过程就会失败。
在捕获错误后,是否有跳过坏行并恢复流式传输?
这是一个简单的例子
var csv = require('csv');
var stream = require('stream');
var parser = csv.parse({ delimiter: "," });
parser.on("data", (chunk) => {
console.log("one chunk");
chunk.forEach((datum) => {
console.log("data: ", datum);
});
});
parser.on("error", (err) => {
// Skip the error and resume stream here
console.log("one error: ", err.message);
});
var test = "00,01,02,03\n10,11,12,23\n21,22,\n30,31,32,33";
var rs = new stream.Readable();
rs._read = () => {};
rs.push(test);
rs.pipe(parser);
这里第三行只有三列,而其他行有四列。我想捕获错误并写出所有其他行。这样做有什么好的策略吗?在csv模块中使用某些功能或选项将是完美的。
答案 0 :(得分:0)
这里有两件事。
第一个是您可以在relax_column_count: true
选项中使用csv.parse
,它应该正常运行。
但如果你测试它,你会看到最后一行丢失了。实际上,即使使用正确的csv字符串传递流的方式也会失败!虽然如果你传递一个合适的csv文件它会工作,所以我怀疑流也有问题。
总而言之,这就是代码。
var csv = require('csv');
var parser = csv.parse({ relax_column_count:true, delimiter: "," });
parser.on("data", (chunk) => {
console.log("one chunk");
chunk.forEach((datum) => {
console.log("data: ", datum);
});
});
parser.on("error", (err) => {
// Skip the error and resume stream here
console.log("one error: ", err.message);
})
parser.on('close',function(){
console.log(parser)
})
require('fs').createReadStream('test.csv').pipe(parser);

并在test.csv
00,01,02,03
10,11,12,23
21,22,23,24
30,31,
34,35,36,37
这里要求的是使用流
的代码
var csv = require('csv');
var stream = require('stream');
var parser = csv.parse({ relax_column_count:true, delimiter: "," });
parser.on("data", (chunk) => {
console.log("one chunk");
chunk.forEach((datum) => {
console.log("data: ", datum);
});
});
parser.on("error", (err) => {
// Skip the error and resume stream here
console.log("one error: ", err.message);
})
parser.on('close',function(){
console.log(parser)
})
var test = "00,01,02,03\n10,11,12,23\n21,22,\n30,31,32,33"
const myReadable = new stream.Readable({
read(size) {
this.push(test)
test = null
}
});
myReadable.pipe(parser);

我认为您的信息流的问题在于您最终没有推送null
并且它没有以良好的方式结束它。