Как заполнить новый столбец даты в существующий файл CSV - PullRequest
0 голосов
/ 25 марта 2020

Я работаю с CSV-файлом (~ 20 МБ). Он имеет три столбца, как показано ниже, а имя файла представляет время начала, то есть метку времени первой строки (в этом случае имя файла 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) ко всем строкам. Как правильно заполнить столбец метки времени?

Пожалуйста, предложите мне эффективный способ добиться этого.

1 Ответ

1 голос
/ 25 марта 2020

Я думаю, что этот код должен работать и решить вашу проблему.

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