2016-10-04 5 views
3

이 모듈을 AWS 람다 함수로 실행하려는 목적으로 node.js를 사용합니다.전체 파일을 다운로드하지 않고 S3의 CSV 파일을 읽고 구문 분석

aws-sdk에서 s3.getObject()을 사용하면 Amazon S3에서 매우 큰 CSV 파일을 성공적으로 선택할 수 있습니다. 의도는 파일의 각 행을 읽고 각 행의 본문으로 이벤트를 방출하는 것입니다.

모든 예에서 S3의 전체 CSV 파일을 버퍼링하거나 스트리밍하고 문자열로 변환 한 다음 한 줄씩 읽어야합니다.

s3.getObject(params, function(err, data) { 
    var body = data.Body.toString('utf-8'); 
} 

원본 CSV 파일의 크기가 주어지면이 작업을 수행하는 데 시간이 오래 걸릴 수 있습니다. 또한 CSV 행의 길이가 다양하기 때문에 버퍼 크기를 옵션으로 사용할 수 있는지 여부는 확실하지 않습니다.

질문

먼저 메모리에 전체 파일을 stringifying 피한다 라인 선으로 그것을 변환/Node.js를에서 S3 파일을 선택하고 읽을 수있는 방법이 있나요?

이상적으로는 수동으로 반복하는 대신 fast-csv 및/또는 node-csv의 더 나은 기능을 사용하는 것이 가장 좋습니다.

답변

7

당신은 빠른 속도로 CSV로 createReadStream method 파이프를 사용할 수 있어야합니다 : 라인으로

const s3Stream = s3.getObject(params).createReadStream() 
require('fast-csv').fromStream(s3Stream) 
    .on('data', (data) => { 
    // do something here 
    }) 
+0

매력이 있습니다. 스트림 우승! – changingrainbows

0

하지 라인하지만 당신은 Range 헤더를 사용하여 바이트 범위로 S3 객체를 얻을 수 있습니다. 따라서 한 번에 1000 바이트를 읽고 데이터를 읽을 때 새 행을 관리 할 수 ​​있습니다. GET Object documentation을보고 Range 헤더를 검색하십시오.

관련 문제