Type Script+ CSV와 격투를 벌인 수많은 이야기
2669 단어 AWSTypeScriptS3csvtech
왜 그렇게 격투를 해요?
감사합니다.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너는 무엇에 빠졌느냐
이번엔 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
의 끝은 말할 것도 없고 기다리지 않나요?그래서 불이 빨리 나요.어쩐지 싸움이 안 되는 것 같더라.
기사가 나잖아요.
결과
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);
}
}
Reference
이 문제에 관하여(Type Script+ CSV와 격투를 벌인 수많은 이야기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/jey_desun/articles/e851695f527561텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)