logo hsb.horse
← 블로그 목록으로 돌아가기

블로그

TransformStream으로 줄 단위 텍스트 분할 구현하기: LineSplitTransform

스트림에서 받은 바이너리 데이터를 줄 단위로 분할하는 TransformStream 구현. 로그 파일과 텍스트 스트림의 점진 처리에 유용하다.

게시일:

LineSplitTransform 은 스트림에서 받은 바이너리 데이터(Uint8Array)를 텍스트로 변환하고 줄바꿈 기준으로 나누기 위한 TransformStream 구현이다.

연속적인 데이터 청크를 처리하면서 각 줄을 별도로 출력하므로 로그 파일이나 큰 텍스트 파일을 순차 처리할 때 적합하다.

구현

TextDecoder 로 바이트열을 문자열로 변환하고, 정규식 /\r?\n/ 으로 줄바꿈마다 분할한다.

버퍼에 남아 있는 미완성 줄은 다음 청크에서 이어 받고, 스트림 종료 시 남은 내용도 함께 출력하는 구조다.

export class LineSplitTransform extends TransformStream<Uint8Array, string> {
constructor() {
let buffer = "";
const decoder = new TextDecoder();
const delimiterRegex = /\r?\n/;
super({
transform(chunk, ctrl) {
buffer += decoder.decode(chunk, { stream: true });
const lines = buffer.split(delimiterRegex);
buffer = lines.pop() || "";
for (const line of lines) {
ctrl.enqueue(line);
}
},
flush(ctrl) {
buffer += decoder.decode();
if (buffer.length > 0) {
ctrl.enqueue(buffer);
}
},
});
}
}

사용 예시

표준 입력 데이터를 LineSplitTransform 에 흘려 보내 줄 단위로 나누고, 각 줄을 콘솔에 출력하는 예시다.

import { LineSplitTransform } from './LineSplitTransform';
// 표준 입력을 LineSplitTransform에 연결
process.stdin.pipeThrough(new LineSplitTransform())
.on('data', (line: string) => {
console.log(`수신한 줄: ${line}`);
});

활용 장면

  • 로그 파일이나 텍스트 파일의 실시간 분석
  • 네트워크에서 수신한 데이터의 순차적인 줄 처리
  • 줄바꿈 구분 텍스트 프로토콜 구현

정리

TransformStream 을 사용하면 스트림 데이터를 줄 단위로 처리하는 구조를 간단하게 만들 수 있다.

큰 파일을 한 번에 메모리에 올리지 않고 순차 처리할 수 있어서 메모리 효율이 좋은 텍스트 처리가 가능하다.