node.js csv如何处理坏数据

时间:2017-11-23 00:40:09

标签: javascript node.js csv error-handling stream

我有一个解析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模块中使用某些功能或选项将是完美的。

1 个答案:

答案 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并且它没有以良好的方式结束它。