テキストの行を、”, ”で区切って一行にするには?

解決


スパム  2010-05-22 07:02:51  No: 38509

ファイルの複数の改行を”, (半角空白)”に一列にしたいのですが、もっと早くなるする方法はありますか?
ポインタとか使うと早くなったりしますか?
勉強させてください。
最終的に、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に書き出される。

全く独学なので、ここは違うとか、こうした方がいいよ、ってのでも書き込んで頂けると、うれしいです。


あんそのいち  2010-05-22 07:31:37  No: 38510

ShiftJIS文字列の場合
Memo1.Lines.Text := StringReplace(TSList.Text, #13#10, #$2C#$20, [rfReplaceAll]);


スパム  2010-05-22 09:14:32  No: 38511

StringReplace(TSList.Text, #13#10, #$2C#$20, [rfReplaceAll]);

だと、2倍以上遅いです。
メモリーの容量にもよる・・・かな?
ファイルサイズは1MBくらいなんですが。

文字コードは、ShiftJISです。
って、数字しか入っていませんが。


スパム  2010-05-22 09:16:23  No: 38512

忘れてました。
シンプルさでは、一番ですね!

ってほめようとも思っていたんだ。
すいません。^^;


D  2010-05-22 10:35:19  No: 38513

改行が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などを使ってファイルをバッファへ読み込んで処理すればもうちょっと速くできます。


KHE00221  URL  2010-05-22 11:06:01  No: 38514

置き換える必要ないよ?

StringList.LineBreak := ',';
Memo1.Lines.Text := StringList.Text;


スパム  2010-05-22 17:37:53  No: 38515

TSList.Text;
ってのがポイントですね。
そうか、一度に読み込んで、処理した方が早いんですね。

50倍以上早くなりました!
スレッド化する必要もなくなったような。
ありがとうございました。

LineBreakは、ヴァージョンのせいかhelpにもありませんでした。
でも、調べてみるとMemoの改行を変えるだけっぽいので、確かに早そうですね。
質問の方向とは、違うアイディアは、おもしろいです。

皆さん、すばらしいアイディア、ありがとうございました。


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

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






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