본문 바로가기

카테고리 없음

대용량 UTF8 파일 읽기

1. 개요


  일반적인 소용량의 Unicode/UTF8 파일은 TStringList나 TStringStream 등을 이용해서 LoadFromFile로 읽어들인 후

여러가지 엔코딩 함수, 예를 들어 UTF8ToWideString, UTF8ToString 등으로 변환할 수 있다.

  그러나 대용량일 경우(100M 이상, ~ 수기가)는 메모리 및 속도의 한계로 인하여 한 번에 메모리에 적재하여 사용하기는 어렵다. 이때 적절하게 UTF8 대용량 파일을 Access하는 방법을 알아보자


2. TextFile 핸들을 이용한 대용량 UTF8 파일 Access

  일반적으로 Text파일을 직접 Access하기 위해서는 다음과 같이 사용할 수 있다.


var
  F : TextFile;
  srcLine : String;
begin
  AssignFile(F, FileName);
  Reset(F);
  while not eoln(F) do
  begin
    Readln(F, srcLine);
    //... Actions
  end;
  CloseFile(F);
end;


  위 소스는 일반적인 코드셋을 가지는 파일일 경우 정상적으로 읽힌다.


  UTF8일 경우 readln에 의해서 읽혀진 srcLine을 UTF8ToWideString으로 변환하면 일부 한글은 변환이 되지만 대부분 깨짐 문자열로 보여지게 된다. 이는 readln에 의해서 읽을 때 UTF8이 아닌 코드셋으로 읽어 들여지기 때문에 읽는 순간 일부 비트를 읽어 버리는 원인으로 변환이 비정상적으로 된다.


  이때 Reset(F) 다음에 단순히 "SetTextCodePage(F, CP_UTF8);" 라인 삽입으로 readln시에 정확히 디코딩된 UTF8 문자열을 얻을 수 있게 된다.


대용량 TEXT UTF8 파일을 라인단위로 읽어서 처리하는 변경된 소스는 다음과 같다.




var
  F : TextFile;
  srcLine : String;
begin
  AssignFile(F, FileName);
  Reset(F);
  SetTextCodePage(F, CP_UTF8);

  while not eoln(F) do
  begin
    Readln(F, srcLine);
    //... Actions
  end;
  CloseFile(F);
end;