[node.js] NodeJS를 사용하여 CSV 파일 구문 분석

nodejs를 사용하여 10000 레코드의 .csv 파일을 구문 분석하고 각 행에 대해 몇 가지 작업을 수행하고 싶습니다. http://www.adaltas.com/projects/node-csv를 사용해 보았습니다 . 나는 이것을 각 행에서 멈출 수 없었다. 이것은 모든 10000 개의 레코드를 읽습니다. 다음을 수행해야합니다.

  1. csv를 한 줄씩 읽습니다.
  2. 각 라인에서 시간 소모적 인 작업 수행
  3. 다음 줄로 이동

누구든지 여기에 대체 아이디어를 제안 해 주시겠습니까?



답변

스트림 기반 솔루션을 사용해야하는 것 같습니다. 이미 그러한 라이브러리가 있었으므로 스스로를 재발 명하기 전에 유효성 검사 지원이 포함 된이 라이브러리를 사용해보십시오. 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");
 });