ファイルの複数の改行を”, (半角空白)”に一列にしたいのですが、もっと早くなるする方法はありますか?
ポインタとか使うと早くなったりしますか?
勉強させてください。
最終的に、10万行もあるテキストが、”, (半角空白)”で区切って、Memoに一行になればokです。
//ファイルを配列に
TSList.LoadFromFile(sPath);
//配列分ループ
for i := 0 to TSList.Count-1 do
begin
//sTextに足していく(10万行もあるので、後半遅くなります。
sText := sText + TSList[i] + ', ';
//どれくらいで終わるか、パーセントを表示
dPercent := Round((TSList.Count -i) / TSList.Count *100);
//重いので、スレッドにしちゃいました。formに進行パーセント表示
Synchronize(UpdateCaption);
end;
//スレッドが終わったら、スレッドクラスのプロパティ?フィールド?により、Memo1に書き出される。
全く独学なので、ここは違うとか、こうした方がいいよ、ってのでも書き込んで頂けると、うれしいです。
ShiftJIS文字列の場合
Memo1.Lines.Text := StringReplace(TSList.Text, #13#10, #$2C#$20, [rfReplaceAll]);
StringReplace(TSList.Text, #13#10, #$2C#$20, [rfReplaceAll]);
だと、2倍以上遅いです。
メモリーの容量にもよる・・・かな?
ファイルサイズは1MBくらいなんですが。
文字コードは、ShiftJISです。
って、数字しか入っていませんが。
忘れてました。
シンプルさでは、一番ですね!
ってほめようとも思っていたんだ。
すいません。^^;
改行がCRLFであるという前提で。
TSList := TStringList.Create;
try
TSList.LoadFromFile(sPath);
sText := TSList.Text;
for i := 1 to Length(sText) do begin
case Ord(sText[i]) of
13: sText[i] := #$2C;
10: sText[i] := #$20;
end;
end;
finally
TSList.Free;
end;
TStringListを使わずにFileReadなどを使ってファイルをバッファへ読み込んで処理すればもうちょっと速くできます。
置き換える必要ないよ?
StringList.LineBreak := ',';
Memo1.Lines.Text := StringList.Text;
TSList.Text;
ってのがポイントですね。
そうか、一度に読み込んで、処理した方が早いんですね。
50倍以上早くなりました!
スレッド化する必要もなくなったような。
ありがとうございました。
LineBreakは、ヴァージョンのせいかhelpにもありませんでした。
でも、調べてみるとMemoの改行を変えるだけっぽいので、確かに早そうですね。
質問の方向とは、違うアイディアは、おもしろいです。
皆さん、すばらしいアイディア、ありがとうございました。
ツイート | ![]() |