如何用node-csvparsing器跳过文件的第一行?

目前我正在使用node-csv( http://www.adaltas.com/projects/node-csv/ )进行csv文件parsing。

有没有办法在开始parsing数据之前跳过文件的前几行? 例如,一些csv报告例如在实际标题和数据开始之前的前几行具有报告细节。

LOG REPORT <- data about the report DATE: 1.1.1900 DATE,EVENT,MESSAGE <- data headers 1.1.1900,LOG,Hello World! <- actual data stars here 

假设你使用新的重构(即csv-generate,csv-parse,stream-transform和csv-stringify)使用v0.4或更高版本,你可以使用内build的转换来跳过第一行,有点额外的工作。

 var fs = require('fs'), csv = require('csv'); var skipHeader = true; // config option var read = fs.createReadStream('in.csv'), write = fs.createWriteStream('out.jsonish'), parse = csv.parse(), rowCount = 0, // to keep track of where we are transform = csv.transform(function(row,cb) { var result; if ( skipHeader && rowCount === 0 ) { // if the option is turned on and this is the first line result = null; // pass null to cb to skip } else { result = JSON.stringify(row)+'\n'; // otherwise apply the transform however you want } rowCount++; // next time we're not at the first line anymore cb(null,result); // let node-csv know we're done transforming }); read .pipe(parse) .pipe(transform) .pipe(write).once('finish',function() { // done }); 

从本质上讲,我们跟踪已经转换的行数,如果我们是第一个(事实上我们希望通过skipHeader bool跳过标题),那么将null作为第二个parameter passing给callbacknull (第一个参数总是错误),否则传递转换后的结果。

这也将同步parsing,但需要更改,因为在同步模式下没有callback。 而且,同样的逻辑也可以应用到较旧的v0.2库,因为它也具有内置的行转换。

请参阅http://csv.adaltas.com/transform/#skipping-and-creating-records

这是相当容易适用的,国际海事组织具有相当低的足迹。 通常情况下,您希望跟踪出于状态目的而处理的行,并且在将结果集发送到Writable之前,我几乎总是转换结果集,因此只需添加额外的逻辑来检查是否跳过标头就非常简单。 这里额外的好处是,我们使用相同的模块来应用跳过逻辑,因为我们要parsing/转换 – 不需要额外的依赖关系。

你有两个select:

  1. 您可以逐行处理文件。 我之前在回答中发布了一个代码片段。 你可以使用它

     var rl = readline.createInterface({ input: instream, output: outstream, terminal: false }); rl.on('line', function(line) { console.log(line); //Do your stuff ... //Then write to outstream rl.write(line); }); 
  2. 你可以给你的文件stream一个偏移量,这将跳过这些字节。 你可以在文档中看到它

     fs.createReadStream('sample.txt', {start: 90, end: 99}); 

    如果你知道偏移量是固定的,这将更容易。