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

解決


サケ  2007-02-02 21:58:50  No: 24729

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


Fusa  2007-02-03 06:17:16  No: 24730

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

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-03 07:40:45  No: 24731

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

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


いける?  2007-02-03 08:28:15  No: 24732

リトルエンディアン、改行は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 20:07:00  No: 24733

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

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

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

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


サケ  2007-02-13 20:27:52  No: 24734

いける?様

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


サケ  2007-02-14 19:54:44  No: 24735

「いける?」さんのプログラムの通りで解決しました.感謝いたします.ただし,下記の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 20:31:35  No: 24736

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


サケ  2007-02-15 23:48:58  No: 24737

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加