node.js - 如何使用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
谢谢!
解决方案
我建议使用优秀的 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
推荐阅读
- sap - Hybris 上的 ycommerce:testId 用途是什么(SAP CX Commerce)
- unix - 将 UNIX 命令的结果分配给变量
- angular - “在收到握手响应之前连接已关闭”尝试使用 websockets 将 Angular 与 Spring 连接时
- google-cloud-storage - 无法使用 dialogflow 播放 .mp3 文件
- android - 通过 Xcode 将 Flutter android 应用部署到 ios
- azure - 修改 Azure B2C 登录 V1 策略/用户流最小密码长度限制
- pine-script - 如何在 Pinescript 上获得 1 分钟蜡烛的 8 小时累积 TWAP?
- php - 以下PHP脚本的执行流程是什么?
- angular - 使用服务或属性和事件的角度性能
- ios - 确定 iOS 中特殊字符的后备 UIFont