Unicode形式で保存したテキストファイルから文字列を読み込み,空行を削除するプログラムを作りたいですが,なかなか上手く行きません.
TStringListで一行ずつ読み込んで空行を削除すると,ANSI形式のテキストファイルでは上手く処理できますが,Unicodeでは駄目でした.
どなたか良い方法がありませんでしょうか.
いやあ、お勧めかどうかはわからないんですが
http://delfusa.main.jp/delfusalibrary/20060527212010/StringUnit/StringUnitHeavy.pas
ここの、LoadWideStringFromFile
を使ってもらってWideString文字列を取得して
http://delfusa.main.jp/delfusalibrary/20060527212010/TemplateList/WideStringRecordList.pas
この、TWideStringRecordList.Textに代入して
普通にStringListっぽく空行削除処理をしてもらって
SaveWideStringToFile
で、ファイル保存してくれたら出来ます。
http://www.tntware.com/delphicontrols/unicode/
Unicode なら ここの、Tnt Unicode Controls を利用したら一番楽な気がする。
この場合は TTntStringList になりますね。
使い方は TStringList と同じだと思います。
リトルエンディアン、改行は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;
ご多忙のところ丁寧にご回答頂きありがとうございます.
自分の都合により回答が遅くなり申し訳ございません.
Fusa様:
ソースコードの意味もそうですけど,やり方が煩雑な気がして試してません.ごめんなさい.できれば,自分でも中身が理解できるような方法でやりたいですね.
風来坊様:
このコンポーネントのインストールの仕方とか使い方等,もうちょっと詳しく説明頂けないでしょうか?
いける?様:
コンパイル時にエラーが出ます.
while (pC^ = $0D)and(pC < pL) do inc(pC, 4); のところです.
どう対処すればよろしいでしょうか.
いける?様
下記,教えていただけますでしょうか.
1.pT^ := pC^; inc(pT); inc(pC);コマンドの役割と,このコマンドが2回続く意味.
2.Size := pT - PChar(Memory); コマンドの意味.
「いける?」さんのプログラムの通りで解決しました.感謝いたします.ただし,下記の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進数?
以上,よろしくお願いいたします.
>3.Size := pT - PChar(Memory); の削除
良い子はキチンと後カタヅケ、ゴミの始末しようね。
生ゴミさん
良い子だけではなく,誰でもゴミはキチンと徹底的に始末しないとね.(^_^)
ただ,自分のレベルで分からないのは,なぜ「Size := pT - PChar(Memory);」このコマンドが必要になるか,なぜこれが後片付けになるかです.どなたかご説明お願いします.
ツイート | ![]() |