如何使用node-csv将标题行添加到CSV文件中?

时间:2016-10-13 17:22:31

标签: javascript node.js csv

我使用node-csv解析了一堆带有节点的csv文件。我有数百个需要解析的文件,但是,我需要在每个文件中添加一个标题行,以利用解析器中的'columns'选项。 columns选项将每一行解析为一个对象,并将标题行作为对象键,但是要使此选项起作用,您当然需要一个标题行。

通过查看文档,我的直觉告诉我,我应该能够通过添加行的转换函数来管道我的节点流,但是我很难在不改变文件中的现有数据的情况下完成这项工作。

这是我在想的,但是如何在“零”列中写一行?

let createStream = function() {
   let stream = fs.createReadStream(transPath+'/'+file, {encoding: 'utf8'});
   let parser = csv.parse({columns: true});
   let transform = csv.transform(function(record, doneTransform){
                             //check if first zero row,
                             //Add header column. 
                             doneTransform(); 
                  }); 
   return stream.pipe(transform).pipe(parser);
};

    createStream().on('data', function(transaction){
        //do stuff with object data
    });

2 个答案:

答案 0 :(得分:3)

真正的解决方案:

let createStream = function() {
  let stream = fs.createReadStream(transPath+'/'+file, {encoding: 'utf8'});
  let parser = csv.parse({skip_empty_lines: false, auto_parse: true, columns: header});
  return stream.pipe(parser);
};

createStream().on('data', function(transaction){
        q.push(transaction);
});

答案 1 :(得分:0)

我通过稍微不同地看待问题来解决这个问题。让我解释。

首先,我上面的初步尝试没有用,因为它错误地使用了Transform和Parse包。您可以单独使用它们,如软件包建议的那样,但是如果您决定一起使用它们,正确的用法要求您首先解析CSV,然后转换它...因此,我上面的尝试在到达时已经死了。

其次,一旦我退出了使用标题的要求,我意识到我真正想要的是一个具有正确键/值对的对象,这导致我尝试自己转换数据,而不是依赖在'列上'为我这样做的选择。

这导致我的结果:如果我可以保证每个记录的顺序和列数,那么可以在转换函数中使用相应数据从两个数组构建一个对象。

以下是代码:

}

'头'是一组键我希望与我从CSV解析的相应值配对。

我正在使用lodash的zipObject函数,该函数从两个数组创建一个Object。你可以在这里找到:zipObject

希望这有助于有人在他们的CSV文件上没有标题时找到他们的解决方案。