首页 > 解决方案 > Nodejs / javaScript 操作 CSV 文件

问题描述

嗨,我有两个 CSV 文件。

  1. 水疗中心.csv
  2. 客户.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。

标签: javascriptnode.jscsv

解决方案


试试这个:

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();

推荐阅读