Как использовать nodejs для обработки CVS - PullRequest
0 голосов
/ 14 сентября 2018

Интересно, как эффективно обрабатывать следующие cvs с помощью nodejs, у меня большой набор данных, поэтому я предпочитаю createReadStream, но набор данных выглядит следующим образом, я хочу суммировать сумму, если открытия и закрытия выполняются одновременно

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

выходной CSV будет

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

Спасибо!

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Я бы посоветовал использовать превосходную библиотеку 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
0 голосов
/ 14 сентября 2018

У меня есть идеальное решение для этого. Я пишу грубый алгоритм для вас.

Steps

  1. Разделить данные CSV с помощью '\ n' -> Преобразовать их в массив
  2. Каждый элемент в массиве назначается csvLineObj.
  3. Теперь вы можете получить доступ к каждой строке по-разному.

var aTempArray=[];

for(will run from 0 to length of CSV){  

  var trArr= csvLineObj.split(","); 
  // Will return an array
  
  if(trArr[1]===trArr[2]){ aTempArray.psuh(csvLineObj); 
  // You have the array of results in aTempArray
  
}

aTempArray.concat("\n"); ---> You have the desired result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...