【问题标题】:how to parse data from two csv in node.js如何在node.js中解析来自两个csv的数据
【发布时间】:2016-12-31 13:07:07
【问题描述】:

我对 node.js 很陌生。我有一个脚本可以解析 csv 并生成所需的输出文件。现在我想同时从另一个 csv 中获取一些列数据并将该值添加到输出文件中。

脚本:

var csv = require('csv');
var fs = require('fs');
var progress = require('progress-stream');
var date = require('date-and-time');

var indexStat = 0;
var header = [];

var headerLine = '$lang=en\n\nINSERT_UPDATE Customer;uid;name;address;phoneno'

var delimeter = ',';
var semicolon = ';';

var inputFile = __dirname+'/project/customer.csv';
var outputFile = __dirname+'/project/customer.impex';
var inputFileName = 'customer.csv';
var outputFileName = 'customer.impex';

function generateRecord(json) {

  var record = semicolon + json.uid + semicolon + json.name + semicolon + json.address;

  return record;
}

var writeStream = fs.createWriteStream(outputFile);

var parser = csv.parse({
delimiter: delimeter
}, function (err, data) {
if (err) {
    console.log(err);
}
});

var transformer = csv.transform(function (data) {
var line = '';
if (indexStat == 0) {
    header = data;
    var line = headerLine;
} else {
    var line = generateRecord(generateRecordObject(data));
}
indexStat++;
writeStream.write(line + '\r\n');
});

function stringSplitter(dataRow) {
  var str = dataRow.toString();
  return str.split(delimeter);
}

function generateRecordObject(dataRow) {
  var record = {};
  dataRow.forEach(function (value, index) {
    if (header[index] != '') {
        record[header[index].toLowerCase()] = value;
    }
});
return record;
}

var stat = fs.statSync(inputFile);
var str = progress({
  length: stat.size,
  time: 100
});

str.on('progress', function (progress) {
   writeCompletedPercentageForRead(progress.percentage, progress.eta, progress.runtime, progress.speed);
});

function removeLineBreaks(obj) {
  obj = obj.replace(/\\N/g, '');
  obj = obj.replace(/&/g, '&');
  return obj;
}

function writeCompletedPercentageForRead(p, e, r, s) {
  process.stdout.clearLine();
  process.stdout.cursorTo(0);
  process.stdout.write(`${inputFileName} read in progress to write ${outputFileName} ... Completed:${parseInt(p, 10)} %, ETA:${e} seconds, Elapsed:${r} seconds, Rate:${parseInt(s/1024, 10)} KBps`);
};

fs.createReadStream(inputFile).pipe(str).pipe(parser).pipe(transformer);

customer.csv ->

uid,name,address
1234,manish,bangalore

上面的脚本工作正常并生成如下的customer.impex文件

INSERT_UPDATE Customer;uid;name;address;phoneno
;1234;manish;bangalore

现在我也想填充 phoneno,但 phoneno 字段是在另一个 csv 文件中定义的,比如说“customer_phone.csv”。

customer_phone.csv -

uid,phoneno
1234,98777767467

我想将 customer.csv 的 uid 列与 customer_phone.csv 匹配,并从该 csv 中获取电话号码。最后我想在 customer.impex outfile 文件中添加 phoneno。

我不知道如何在这里解析两个 csv 并生成文件。有什么帮助吗?

【问题讨论】:

    标签: node.js csv npm fs


    【解决方案1】:
    var Converter = require("csvtojson").Converter;
    var fs = require("fs");
    
    var pathToMainCSV = "./customer.csv";
    var pathToContactsCSV = "./contact.csv";
    
    var customerConverter = new Converter({});
    var contactConverter = new Converter({});
    
    var contanierObj = {};
    
    function processContacts() {
        fs.createReadStream(pathToContactsCSV).pipe(contactConverter);
    }
    
    function createImpexFile() {
        var headerLine = '$lang=en\n\nINSERT_UPDATE Customer;uid;name;address;phoneno;\n';
        Object.keys(contanierObj).forEach(obj => {
            Object.keys(contanierObj[obj]).forEach(data => {
                headerLine += contanierObj[obj][data] + ';';
            });
            headerLine += '\n';
        });
        fs.writeFile("./new.impex", headerLine, function(err) {
            if (err) {
                return console.log(err);
            }
            console.log("The file was saved!");
        });
    }
    
    customerConverter.on("end_parsed", function(jsonArray) {
        jsonArray.forEach(v => {
            contanierObj[v.uid] = v;
        });
        processContacts();
    });
    
    contactConverter.on("end_parsed", function(jsonArray) {
        jsonArray.forEach(v => {
            contanierObj[v.uid].contact = v.phoneno;
        });
        createImpexFile();
    });
    
    fs.createReadStream(pathToMainCSV).pipe(customerConverter);
    

    请像我上面所做的那样,根据您的需要格式化字符串

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-24
      • 2012-04-19
      • 2021-02-07
      • 2021-03-06
      • 2019-04-15
      • 1970-01-01
      • 1970-01-01
      • 2014-05-25
      相关资源
      最近更新 更多