【问题标题】:How to populate new date column to existing CSV file如何将新日期列填充到现有 CSV 文件
【发布时间】:2020-03-26 00:17:43
【问题描述】:

我正在处理 CSV 文件 (~20MB)。它具有如下所示的三列,文件名表示开始时间,即第一行的时间戳(在这种情况下,文件名是20200325131010000.csv)。

x;y;z
3;-132;976
3;-131;978
3;-130;975
4;-132;975
5;-131;976
3;-132;975

连续行的时间戳相差20毫秒。如何有效地将新日期列填充到现有文件中?最终的 CSV 文件应如下所示:

timestamp;x;y;z
20200325131010000;3;-132;976
20200325131010020;3;-131;978
20200325131010040;3;-130;975
20200325131010060;4;-132;975
20200325131010080;5;-131;976
20200325131010100;3;-132;975

到目前为止,我已经尝试了以下代码:

  const csv = require('csv-parser');
  const fs = require('fs');
  var json2csv = require('json2csv').parse;
  var dataArray = []; 
    fs.createReadStream('C:/Users/Downloads/20200325131010000.csv')
      .pipe(csv())
      .on('data', (row) => {
        row.timestamp= "20200325131010000"; 
        dataArray.push(row);
      })
      .on('end', () => {
        var result = json2csv({ data: dataArray, fields: Object.keys(dataArray[0]) });
        fs.writeFileSync("test.csv", result);
      });

以上代码生成以下输出(所有时间戳都相同,这是不可取的):

timestamp;x;y;z
20200325131010000;3;-132;976
20200325131010000;3;-131;978
20200325131010000;3;-130;975
20200325131010000;4;-132;975
20200325131010000;5;-131;976
20200325131010000;3;-132;975

此代码的问题在于它向所有行添加了相同的时间戳(即20200325131010000)。如何正确填充时间戳列?

请建议我一种有效的方法来实现这一目标。

【问题讨论】:

    标签: javascript node.js csv node-csv-parse


    【解决方案1】:

    我认为这段代码应该可以解决你的问题。

      const csv = require('csv-parser');
      const fs = require('fs');
      var json2csv = require('json2csv').parse;
    
      const filePath = 'C:/Users/Downloads/20200325131010000.csv';
      const fileName = (/^.+\/([^/]+)\.csv$/gi).exec(filePath)[1]; // extract file name from path
      const intialTimestamp = parseInt(fileName); // convert string to number
      let i = 0;
      var dataArray = []; 
        fs.createReadStream(filePath)
          .pipe(csv())
          .on('data', (row) => {
            row.timestamp= (intialTimestamp + (i * 20)).toString(); // increase the number by 20 everytime
            dataArray.push(row);
            i++;
          })
          .on('end', () => {
            var result = json2csv({ data: dataArray, fields: Object.keys(dataArray[0]) });
            fs.writeFileSync("test.csv", result);
          });
    

    【讨论】:

    • 那么我没有新的列时间戳。我需要一个新列,如何填充它(添加 20 毫秒以获取其余行的时间戳)?
    • 哦,好的,我有解决您问题的方法。我将更新我的答案和代码 sn-p 让您有所了解。
    • @SaurabhChauhan 我刚刚更新了我的代码,请测试它并告诉我它是否适合你。
    • 您能否指导我:在上面的代码中,它将 json 格式的数据写入 csv 文件(看起来 json2csv 似乎不起作用)。如何在 csv 文件中存储正确的数据?
    • @SaurabhChauhan 我认为您应该看一下代码示例,该示例展示了如何将 JSON 对象转换为 CSV 格式的字符串:npmjs.com/package/json2csv#example-1 希望对您有所帮助
    猜你喜欢
    • 2021-04-01
    • 1970-01-01
    • 2017-09-18
    • 2017-06-30
    • 2016-11-24
    • 1970-01-01
    • 2016-04-13
    • 2017-09-23
    • 1970-01-01
    相关资源
    最近更新 更多