【问题标题】:How do I add a header row to a CSV file using node-csv?如何使用 node-csv 向 CSV 文件添加标题行?
【发布时间】:2016-10-13 17:22:30
【问题描述】:

我正在使用 node-csv 解析一堆带有节点的 csv 文件。我有数百个需要解析的文件,但是,我需要为每个文件添加一个标题行以使用解析器中的“列”选项。 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
    });

【问题讨论】:

    标签: javascript node.js csv


    【解决方案1】:

    真正的解决方案:

    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);
    });
    

    【讨论】:

    • 感谢您添加此解决方案。我同意你的看法,这是一个更好的解决方案。
    【解决方案2】:

    我通过稍微不同的方式解决了这个问题。让我解释。

    首先,我上面的初始尝试没有成功,因为它错误地使用了 Transform 和 Parse 包。正如软件包所建议的那样,您可以独立使用它们,但如果您决定一起使用它们,正确的用法要求您首先解析您的 CSV,然后对其进行转换......因此,我上面的尝试在到达时就失败了。

    其次,一旦我放弃了使用标头的要求,我意识到我真正想要的是一个具有正确键/值对的对象,这导致我尝试自己转换数据,而不是依赖在“列”选项上为我执行此操作。

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

    代码如下:

    let createStream = function() {
      let stream = fs.createReadStream(transPath+'/'+file, {encoding: 'utf8'});
      let parser = csv.parse({skip_empty_lines: false, auto_parse: true});
      let transform = csv.transform(function(record, doneTransform){
                       let newObject = _.zipObject(header, record);
                       doneTransform(null, newObject);
                      });
      return stream.pipe(parser).pipe(transform);
    };
    
    createStream().on('data', function(transaction){
            q.push(transaction);
    });
    

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-12
      • 2013-04-01
      • 2021-06-28
      • 2020-09-05
      • 1970-01-01
      • 2018-10-16
      相关资源
      最近更新 更多