Delphiでのテキストファイルの読み込みについて


Delphiでテキストファイルの読み込み方法は色々あるが、一長一短なので、場合によって使い分ける。
TStreamReaderかTFileを使うのが普通だと思うが、ロックされたファイルの読込ができないという問題がある。

TStreamReader TFile AssignFile
ロックされたファイルの読込 × ×
全文読込 ×
一行毎読込 ×
文字コード対応
はじめから読み直し(Reset) × ×
  • 改行コードはすべてCRLF,LFに対応している
  • TStringList.LoadFromFile()はTFileとほぼ同じ

エンコードについて

TStreamReader TFile AssignFile
Ascii
SJIS
UTF-8(BOMなし) ×
UTF-8(BOMあり) ×
  • ○は文字コードの指定なしで読み込める
  • △は文字コードの指定なしでは読み込めないが、指定すれば読み込める

TStreamReader使用例

  try
    sr := TStreamReader.Create(filename);
    str := sr.ReadToEnd();       //全文string読込(ここでも文字コードの例外が飛ぶ可能性あり)
    while not sr.EndOfStream do  //(ここでも文字コードの例外が飛ぶ可能性あり)
    begin
      line := sr.ReadLine;     //一行読込
    end;
  except
    on e: Exception do
    begin
      ShowMessage('ERROR:' + e.Message);
      exit;
    end;
  end;
  sr.Free();
  sl := TStringList.Create();
  sl.Text := str;            //全文TStringList読込はないのでstringを代入

TFile使用例

  try
    str := TFile.ReadAllText(filename);   //全文string読込
    sa  := TFile.ReadAllLines(filename);  //全文TStringDynArray読込
  except
    on e: Exception do
    begin
      ShowMessage('ERROR:' + e.Message);
      exit;
    end;
  end;

AssignFile使用例

  AssignFile(f, filename);
  try
    Reset(f);
  except
    on e: Exception do
    begin
      ShowMessage('ERROR:' + e.Message);
      exit;
    end;
  end;
  while not Eof(f) do
  begin
    ReadLn(f, line);     //一行読込
  end;
  CloseFile(f); // Resetで例外が飛んでもその後の処理を行う場合は、
                // CloseFileでも例外が飛ぶので、tryでくくる必要があるので注意