Type Script+ CSV와 격투를 벌인 수많은 이야기

왜 그렇게 격투를 해요?


감사합니다.Desun입니다.
오늘 우리는 대량의 CSV를 처리하기 위해 치열하게 싸운 이야기를 Type Script로 여러분에게 보고할 것입니다.

일의 발단


서비스를 장기간 개발/운용하다 보면 어떻게든 하고 싶은 일이 종종 생긴다.
이번에는 백만 줄의 CSV를 한 줄씩 가공해 데이터베이스에 저장해야 한다고 한다.

넣다


뭐, 읽을 때 금방 만들었어.
↓ 좀 어울리긴 하지만 이런 느낌
import {GetObjectCommand, S3Client} from '@aws-sdk/client-s3'

const s3 = new S3Client({
    region: 'ap-northeast-1'
});

const result = await s3.send(
    new GetObjectCommand({
        Bucket: 'Bucket',
        Key: 'Key'
    })
);

const stream   = result.Body as Readable;
※ aws-sdk의 v3
https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/index.html

너는 무엇에 빠졌느냐


https://nodejs.org/api/stream.html
이번엔 CSV에서 sjis처럼 느껴지니까 pipe parse나 decode로data 활동 중에 방법을 강구하다.
stream.pipe(parse({encoding: 'sjis-win'}))
      .pipe(decode(data,))
      .on('data', data => {
    logger.debug(data);
});
여기서 문제가 된 것은 DB를 한 줄 한 줄 넣는 것이 상당히 부하가 되기 때문에 하나하나 집중해서 대량 삽입을 하려는 것이다.
그리고 나는 심상치 않은 이유로 처리가 끝날 때까지 기다리고 싶다.
그러나 이런 문법은 병행 처리이기 때문에 전혀 안 된다end 활동 중에 방법을 생각해도 end 활동data의 끝은 말할 것도 없고 기다리지 않나요?그래서 불이 빨리 나요.
어쩐지 싸움이 안 되는 것 같더라.

기사가 나잖아요.


https://qiita.com/kaz2ngt/items/ef2617aab3ae3209d81e
결과for-await-of너무 간단해...무지막지한 기사가 나오잖아...

결실


이번에는 속도를 의식하지 않고 한 줄 한 줄 기다리고 있다for-await-of가 잘 어울린다.
import {GetObjectCommand, S3Client} from '@aws-sdk/client-s3'
import iconv from "iconv-lite";
import {parse} from "csv-parse/sync";

async execute() {
    const s3 = new S3Client({
        region: 'ap-northeast-1'
    });
    
    const result = await s3.send(
        new GetObjectCommand({
            Bucket: 'Bucket',
            Key: 'Key'
        })
    );
    
    const stream   = result.Body as Readable;
    const readline = createInterface(stream.pipe(iconv.decodeStream('cp932'))); // 文字コード変換
    for await (const line of readline) {
        console.log("line = " + line);
    }
}

좋은 웹페이지 즐겨찾기