Unicode形式のテキストファイルの空行を削除する方法

解決


サケ  2007-02-02 12:58:50  No: 24729  IP: 192.*.*.*

Unicode形式で保存したテキストファイルから文字列を読み込み,空行を削除するプログラムを作りたいですが,なかなか上手く行きません.
TStringListで一行ずつ読み込んで空行を削除すると,ANSI形式のテキストファイルでは上手く処理できますが,Unicodeでは駄目でした.
どなたか良い方法がありませんでしょうか.

編集 削除
Fusa  2007-02-02 21:17:16  No: 24730  IP: 192.*.*.*

いやあ、お勧めかどうかはわからないんですが

http://delfusa.main.jp/delfusalibrary/20060527212010/StringUnit/StringUnitHeavy.pas
ここの、LoadWideStringFromFile
を使ってもらってWideString文字列を取得して

http://delfusa.main.jp/delfusalibrary/20060527212010/TemplateList/WideStringRecordList.pas
この、TWideStringRecordList.Textに代入して

普通にStringListっぽく空行削除処理をしてもらって
SaveWideStringToFile
で、ファイル保存してくれたら出来ます。

編集 削除
風来坊  2007-02-02 22:40:45  No: 24731  IP: 192.*.*.*

http://www.tntware.com/delphicontrols/unicode/
Unicode なら ここの、Tnt Unicode Controls を利用したら一番楽な気がする。

この場合は TTntStringList になりますね。
使い方は TStringList と同じだと思います。

編集 削除
いける?  2007-02-02 23:28:15  No: 24732  IP: 192.*.*.*

リトルエンディアン、改行はCRLF($000D $000A)限定。

var
  pT, pC, pL: PChar;
  FirstLine: Boolean;
begin
  with TMemoryStream.Create do try
    LoadFromFile(元ファイル);
    pT := Memory;
    pL := pT + Size;
    pC := pT;
    FirstLine := True;
    while pC < pL do begin
      if pC^ = #$0D then begin
        if FirstLine then begin
          FirstLine := False;
          while (pC^ = $0D)and(pC < pL) do inc(pC, 4);
        end else begin
          while ((pC+4)^ = #$0D)and(pC < pL) do inc(pC, 4);
        end;
      end;
      pT^ := pC^; inc(pT); inc(pC);
      pT^ := pC^; inc(pT); inc(pC);
    end;
    Size := pT - PChar(Memory);
    SaveToFile(空行削除ファイル);
  finally
    Free;
  end;
end;

編集 削除
サケ  2007-02-13 11:07:00  No: 24733  IP: 192.*.*.*

ご多忙のところ丁寧にご回答頂きありがとうございます.
自分の都合により回答が遅くなり申し訳ございません.

Fusa様:
ソースコードの意味もそうですけど,やり方が煩雑な気がして試してません.ごめんなさい.できれば,自分でも中身が理解できるような方法でやりたいですね.

風来坊様:
このコンポーネントのインストールの仕方とか使い方等,もうちょっと詳しく説明頂けないでしょうか?

いける?様:
コンパイル時にエラーが出ます.
while (pC^ = $0D)and(pC < pL) do inc(pC, 4);  のところです.
どう対処すればよろしいでしょうか.

編集 削除
サケ  2007-02-13 11:27:52  No: 24734  IP: 192.*.*.*

いける?様

下記,教えていただけますでしょうか.
1.pT^ := pC^; inc(pT); inc(pC);コマンドの役割と,このコマンドが2回続く意味.
2.Size := pT - PChar(Memory);  コマンドの意味.

編集 削除
サケ  2007-02-14 10:54:44  No: 24735  IP: 192.*.*.*

「いける?」さんのプログラムの通りで解決しました.感謝いたします.ただし,下記の3箇所を修正しましたのでご報告します.
1.while (pC^ = $0D)and(pC < pL) do inc(pC, 4);をwhile (pC^ = #$0D)and(pC < pL) do inc(pC, 4);に
2.pT^ := pC^; inc(pT); inc(pC);が1個削除
3.Size := pT - PChar(Memory);  の削除
これで上手く行きました.「いける?」さん!勉強になりました.

恥ずかしながら,下記教えていただけると嬉しいです.
1.上記3番目のコマンドの意味
2.#$0Dの#の意味,ちなみに$は16進数?
以上,よろしくお願いいたします.

編集 削除
生ゴミ  2007-02-14 11:31:35  No: 24736  IP: 192.*.*.*

>3.Size := pT - PChar(Memory);  の削除
良い子はキチンと後カタヅケ、ゴミの始末しようね。

編集 削除
サケ  2007-02-15 14:48:58  No: 24737  IP: 192.*.*.*

生ゴミさん
良い子だけではなく,誰でもゴミはキチンと徹底的に始末しないとね.(^_^)
ただ,自分のレベルで分からないのは,なぜ「Size := pT - PChar(Memory);」このコマンドが必要になるか,なぜこれが後片付けになるかです.どなたかご説明お願いします.

編集 削除