首页 > 解决方案 > 如何使用nodejs处理cvs

问题描述

我想知道如何使用nodejs有效地处理以下cvs,我有很大的数据集,所以我更喜欢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

谢谢!

标签: node.jsdatabasecsv

解决方案


我建议使用优秀的 csv-parse 库,我永远不会推荐使用你自己的 csv 解析解决方案。

在这个例子中,我们边走边解析和求和。

最后一条记录需要特殊处理,如图!

测试文件.csv

金额,打开,关闭
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

例子.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);

我们得到如下所示的输出:

输出文件.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

推荐阅读