2016-08-24 7 views
0

私はnode.jsを初めて使っています。私はcsvを解析し、必要な出力ファイルを生成するスクリプトを1つ持っています。今私はいくつかの列データを別のCSVから同時に取り出し、その値を出力ファイルに追加したいと思います。node.jsの2つの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 - 上記のスクリプトが正常に動作し、以下のようにcustomer.impexファイルを生成している>

uid,name,address 
1234,manish,bangalore 

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

今私がしたいです人口はphonenoですが、フォネノフィールドは別のCSVファイルで定義されていますr_phone.csv '。

customer_phone.csv -

uid,phoneno 
1234,98777767467 

私はcustomer_phone.csvでcustomer.csvのUID列にマッチし、そのCSVファイルからPHONENOを取得したいです。最後に、customer.impex outfileファイルにphonenoを追加します。

ここで2つのcsvを解析してファイルを生成する方法はわかりません。どんな助け?私は上記のように行っている

答えて

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

親切にあなたのニーズに応じてフォーマットし、文字列を何かを使用

関連する問題