nodejs를 사용하여 10000 레코드의 .csv 파일을 구문 분석하고 각 행에 대해 몇 가지 작업을 수행하고 싶습니다. http://www.adaltas.com/projects/node-csv를 사용해 보았습니다 . 나는 이것을 각 행에서 멈출 수 없었다. 이것은 모든 10000 개의 레코드를 읽습니다. 다음을 수행해야합니다.
- csv를 한 줄씩 읽습니다.
- 각 라인에서 시간 소모적 인 작업 수행
- 다음 줄로 이동
누구든지 여기에 대체 아이디어를 제안 해 주시겠습니까?
답변
스트림 기반 솔루션을 사용해야하는 것 같습니다. 이미 그러한 라이브러리가 있었으므로 스스로를 재발 명하기 전에 유효성 검사 지원이 포함 된이 라이브러리를 사용해보십시오. https://www.npmjs.org/package/fast-csv
답변
나는 이렇게 사용했다 :-
var fs = require('fs');
var parse = require('csv-parse');
var csvData=[];
fs.createReadStream(req.file.path)
.pipe(parse({delimiter: ':'}))
.on('data', function(csvrow) {
console.log(csvrow);
//do something with csvrow
csvData.push(csvrow);
})
.on('end',function() {
//do something with csvData
console.log(csvData);
});
답변
내 현재 솔루션은 비동기 모듈을 사용하여 직렬로 실행합니다.
var fs = require('fs');
var parse = require('csv-parse');
var async = require('async');
var inputFile='myfile.csv';
var parser = parse({delimiter: ','}, function (err, data) {
async.eachSeries(data, function (line, callback) {
// do something with the line
doSomething(line).then(function() {
// when processing finishes invoke the callback to move to the next one
callback();
});
})
});
fs.createReadStream(inputFile).pipe(parser);
답변
- 이 솔루션은 위의 일부 답변에서 사용되는
csv-parser
대신 사용 됩니다csv-parse
. csv-parser
약 2 년 후에 왔습니다
csv-parse
.- 둘 다 동일한 목적을 해결하지만 개인적으로
csv-parser
헤더를 처리하기 쉽기 때문에 더 나은 것을 발견
했습니다.
먼저 csv-parser를 설치합니다.
npm install csv-parser
따라서 다음과 같은 csv 파일이 있다고 가정합니다.
NAME, AGE
Lionel Messi, 31
Andres Iniesta, 34
다음과 같이 필요한 작업을 수행 할 수 있습니다.
const fs = require('fs');
const csv = require('csv-parser');
fs.createReadStream(inputFilePath)
.pipe(csv())
.on('data', function(data){
try {
console.log("Name is: "+data.NAME);
console.log("Age is: "+data.AGE);
//perform the operation
}
catch(err) {
//error handler
}
})
.on('end',function(){
//some final operation
});
자세한 내용은
답변
fast-csv 에서 스트리밍을 일시 중지 하려면 다음을 수행 할 수 있습니다.
let csvstream = csv.fromPath(filePath, { headers: true })
.on("data", function (row) {
csvstream.pause();
// do some heavy work
// when done resume the stream
csvstream.resume();
})
.on("end", function () {
console.log("We are done!")
})
.on("error", function (error) {
console.log(error)
});
답변
참조하는 node-csv 프로젝트는 http://csv.adaltas.com/transform/ 의 문서에서 CSV 데이터의 많은 부분의 각 행을 변환하는 작업에 완전히 충분합니다 .
csv()
.from('82,Preisner,Zbigniew\n94,Gainsbourg,Serge')
.to(console.log)
.transform(function(row, index, callback){
process.nextTick(function(){
callback(null, row.reverse());
});
});
내 경험으로 볼 때 그것은 또한 다소 빠른 구현이라고 말할 수 있으며, 거의 10k 레코드가있는 데이터 세트에서 작업 해 왔으며 처리 시간은 전체 세트에 대해 적절한 수십 밀리 초 수준이었습니다.
Rearding jurka 의 스트림 기반 솔루션 제안 : 노드 CSV는 스트림 기반으로하고 Node.js를 다음 ‘API를 스트리밍한다.
답변
빠르게 CSV NPM 모듈은 데이터 라인 별 CSV 파일에서 읽을 수 있습니다.
예를 들면 다음과 같습니다.
let csv= require('fast-csv');
var stream = fs.createReadStream("my.csv");
csv
.parseStream(stream, {headers : true})
.on("data", function(data){
console.log('I am one line of data', data);
})
.on("end", function(){
console.log("done");
});