javascript - Nodejs / javaScript 操作 CSV 文件
问题描述
嗨,我有两个 CSV 文件。
- 水疗中心.csv
- 客户.csv
水疗中心.csv
id | name
...........................
5 | Wasana spa
...........................
7 | Hot spring spa
...........................
8 | Colombo spa
...........................
10 | Sanhida spa
...........................
12 | Waruna spa
...........................
客户.csv
id | name | spaId
........................
1 |Hiran |5
........................
2 |Hirushi|5
........................
3 |Mishani|8
........................
4 |Chamod |12
这两个 CSV 文件从MYSQL DB
. 我想要的是像这样更改spaId
文件Customers.csv
。
id | name | spaId
........................
1 |Hiran |1
........................
2 |Hirushi|1
........................
3 |Mishani|3
........................
4 |Chamod |5
这些新的 spaId 来自Spas.csv文件的行号。示例:- id 5 位于第 1 行,因此将第 5 行替换为第 1 行。
我如何在 nodejs / javaScript 中实现这一点。我到现在做的就是这个。
var fs = require('fs')
var csv = require('fast-csv');
fs.createReadStream('spas.csv')
.pipe(csv())
.on('data',function(data){
console.log('DATA',data)
})
.on('end',function(data){
console.log("FIN",data)
})
基本上这会将每一行记录为一个数组,我不知道如何同时写入 CSV。
解决方案
试试这个:
const fs = require("fs");
const csv = require("fast-csv");
async function getSpasIdMap(filePath){
return new Promise(function(resolve, reject) {
let map = {};
let count = 0;
let stream = fs.createReadStream(filePath);
let csvStream = csv({ headers:true })
.on("data", function(data){
map[data.id] = ++count;
})
.on("error", (e) => {
reject(e);
})
.on("end", function(){
resolve(map);
});
stream.pipe(csvStream);
})
}
async function computeAndWriteCustomerData(spasSource, customerSource, dest){
let spasMap = await getSpasIdMap(spasSource);
let customerStream = fs.createReadStream(customerSource);
let csvCustomerStream = csv({headers:true})
.transform(function(row) {
return `${row.name},${spasMap[row.spaId]}\n`;
});
let writableStream = fs.createWriteStream(dest);
customerStream.pipe(csvCustomerStream);
csvCustomerStream.pipe(writableStream);
}
async function main() {
await computeAndWriteCustomerData("spas.csv", "customer.csv", "my.csv");
}
main();
推荐阅读
- javascript - 在 React 热刷新或文件创建后触发脚本
- html - Prestashop 1.7 产品名称中的上标字符
- php - 使用来自 function.php 的 woocommerce 结帐后发出警报
- html - 使图像可点击的角度
- c# - ControlTemplate 图标作为 AvalonDock LayoutAnchorableItem WPF/C# 的 ImageSource
- linux - 如何使用命令行从 xml 节点中删除表情符号
- python - 如果用户输入无效的城市名称,如何处理 python djangon geocoder osm 错误
- laravel - Laravel Telescope - 在请求面板中仅记录错误状态
- c++ - qt.core.qmetaobject.connectslotsbyname:QMetaObject::connectSlotsByName:on_comboBox_2_activated(QString) 没有匹配信号
- angular - Angular Custom 组件的独特性