Я бы посоветовал использовать превосходную библиотеку csv-parse, я бы никогда не рекомендовал использовать собственное решение для синтаксического анализа csv.
В этом примере мы анализируем и суммируем по ходу.
Последняя запись требует особой обработки, как показано!
testfile.csv
amount,open,close
100,2017-08-28 13:18:46,2017-08-30 11:18:01
200,2017-08-28 13:18:46,2017-08-30 11:18:01
300,2017-08-28 13:18:46,2017-08-30 11:18:01
100,2017-08-30 03:32:24,2017-08-30 11:18:01
200,2017-08-30 03:32:24,2017-08-30 11:18:01
100,2017-08-28 13:19:24,2017-08-30 11:18:01
100,2017-08-30 03:32:24,2017-08-30 11:18:01
example.js
const parse = require('csv-parse');
const transform = require('stream-transform');
const fs = require('fs');
let input = fs.createReadStream('testfile.csv');
let outputStream = fs.createWriteStream('outfile.csv');
function sumRecords(cache) {
let first = cache[0];
return cache.reduce((acc,rec) => {
acc[0] += Number(rec[0]);
return acc;
}, [0, first[1], first[2]]);
}
// Cache of same records.
records = [];
var parser = parse({delimiter: ','})
var transformer = transform((record, callback) => {
// Skip header..
if (record[0] == 'amount') {
callback(null, record.join(',') + '\n');
return;
}
if (records.length != 0) {
let firstRecord = records[0];
if (firstRecord[1] != record[1] || firstRecord[2] != record[2]) {
// Sum up records.
let outputRecord = sumRecords(records);
callback(null, outputRecord.join(',') + '\n');
records = []; // Clear our cache.
}
}
records.push(record);
});
input.pipe(parser).pipe(transformer).pipe(outputStream);
// Write any remaining records to file.
setTimeout(() => {
fs.appendFile('outfile.csv', sumRecords(records).join(','), () => {});
}, 1000);
Мы получаем вывод, который выглядит следующим образом:
outfile.csv
amount,open,close
600,2017-08-28 13:18:46,2017-08-30 11:18:01
300,2017-08-30 03:32:24,2017-08-30 11:18:01
100,2017-08-28 13:19:24,2017-08-30 11:18:01
100,2017-08-30 03:32:24,2017-08-30 11:18:01