改行の無いテキストファイルを読み込むには?

解決


gravisfreak  2006-01-16 20:42:07  No: 19669

Delphi初心者のgravisfreakです。
改行の無いテキストファイルを読み込んで、任意の場所に改行を入れる、プログラムを作りたいのですが、読み込むテキストの1行が長すぎて後半の文字が切れてしまいます。
今は、一旦、TMemoに読み込んで処理しようとしています。
Memo1.Lines.LoadFromFile(FileName);

何か良い方法がありましたら、ご教授お願いします。


長い?  2006-01-16 20:51:26  No: 19670

>読み込むテキストの1行が長すぎて...
どのくらい長いのかな?

>今は、一旦、TMemoに読み込んで処理しようとしています。
メモリかTStringsに読み込んで処理後に表示したら?


ん?  2006-01-16 21:10:29  No: 19671

改行位置を固定にするなら、

TFileStreamでテキストファイルを開き
FileStream.LoadFromFile(hogehoge)

一行分づつ読み込み、
var
  bufHoge :array[0..一行分の文字数] of Char;
FileStream.Read(bufHoge, 一行分の文字数)

はき出す
TMemo.Lines.Add(bufHoge)

とか?


gravisfreak  2006-01-16 22:52:20  No: 19672

テキストは、5000文字弱位です。
TStringは、試してみましたがダメでした。

改行位置は、固定ではなく任意の文字列の前に入れたいです。

例)
テキスト
abcdefgabcdabcdefghijk
↓変換後
abcdefg
abcd
abcdefghijk

>TFileStreamでテキストファイルを開き
>FileStream.LoadFromFile(hogehoge)
は、どうやって使うのでしょう?
未定義の識別子 : 'LoadFromFile'と出てしまいます。
スイマセン無知なもので・・・


deldel  2006-01-16 23:44:40  No: 19673

今ひとつどういった出力が欲しいのか判らないので
答えにくいのですが、とりあえず、以下のコードでは、
5000.txt の内容(5000文字)を100文字ずつ、50行表示
させることができました。
ので、
>TStringは、試してみましたがダメでした。
が?ですが・・・

var
  sl: TStringList;
  iw: Word;
begin
  sl := TStringList.Create;
  try
    sl.LoadFromFile('c:\5000.txt');
    ShowMessage(IntToStr(Length(sl[0]))); //5000と表示される

    for iw := 1 to 50 do begin
      Memo1.Lines.Add(Copy(sl[0], (iw - 1) * 100 + 1, 100));
    end;
  finally
    sl.Free;
  end;
end;


5000は序の口  2006-01-17 00:41:40  No: 19674

>スイマセン無知なもので・・・
「無知」「初心者」は免罪符にあらざれば…

const
  ACHAR = 'a';
var
  pT, pL, pW: PChar;
begin
  with TMemoryStream.Create do begin
   // ランダム小文字5000個保存
   //Randomize;
   SetSize(5000);
   pT := Memory;
   pL := pT + Size;
   while pT < pL do begin
    pT^ := Chr(Random(26)+$61);
    inc(pT);
   end;
   SaveToFile('ほにゃ.txt');

   //読み込んで、ACHAR「a」の前で改行
   LoadFromFile('ほにゃ.txt');
   pT := Memory;
   pL := pT + Size;
   pW := pT;
   while pW < pL do begin
    if pW^ = ACHAR then begin
     pW^ := #0;
     Memo1.Lines.Add(pT);
     pW^ := ACHAR;
     pT := pW;
    end;
    inc(pW);
   end;
   Free;
  end;


横ヤリマン  2006-01-17 00:46:52  No: 19675

> >TFileStreamでテキストファイルを開き
> >FileStream.LoadFromFile(hogehoge)
> は、どうやって使うのでしょう?
> 未定義の識別子 : 'LoadFromFile'と出てしまいます。
Help見てみれ
TFileStreamにLoadFromFileはない。
たぶんTStringListとごっちゃになってるだけだわ。

> TStringは、試してみましたがダメでした。
ダメなら、どうダメなのか書くこと。
そうじゃないと、何がダメかわからんでしょ?

あと、TStringじゃなくて、TStringListだな。

効率にこだわらないのであれば、TStringListのLoadFromFileでファイルを読み込む。
で、こんな感じや。
var
  hoge,hoge2: String;
  stringlsit: TStringList;
  i:Integer;
begin
  略
  stringlsit.LoadFromFile(ふぁいる)
  hoge := stringlsit.Text;
  //漢字があるならAnsiPosが望ましい
  //改行用文字検索
  i := Pos(検索文字, hoge);
  while i > 0 do begin
    //これが一行分
    hoge2 := Copy(hoge, 1, i-1);
    //一行分の文字削り取る
    Delete(hoge, 1, i-1);
    //次の改行用文字検索
    i := Pos(検索文字, hoge);
  end;
end;

動くどうかも、コンパイルが通るかも試してないから、あとは自分で考えな。

「初心者」という単語は、なんでもおまかせにしていいという免罪符じゃないことを覚えておきや。


トカゲのシッポ  2006-01-17 00:59:40  No: 19676

To:「5000は序の口」さん

5000+1 Byte確保しといて、Freeの前にシッポも保存だね。
>  .....
>  end;
   pL^ := #0;
   Memo1.Lines.Add(pT);
>  Free;
> end;


gravisfreak  2006-01-17 20:28:13  No: 19677

確かに、適当に1行5000文字のテキストファイルを作ってTStringListでやったら出来ました。
しかし、なぜか私の変換したいファイルを開くと669文字までしか読んでくれません。
変換したいファイルは、特殊な装置(PCではない)が吐き出したログのような物なので、
中身が多少おかしいのかもしれません。

「5000は序の口」さんの方法でやると、最後まで読んでくれるのですが、これまた
何故か途中の一部が抜けてしまいます。

変換するファイルを一度、何かのエディタ(メモ帳等)で開いて上書き保存すると、
両方の方法で、きちんと読んでくれる様になります。
多少面倒ですが、この方法で対応しようと思います。

皆さんどうもありがとう御座います。
無知は罪である事、肝に免じておきます。


ん?  2006-01-17 21:28:48  No: 19678

> しかし、なぜか私の変換したいファイルを開くと669文字までしか読んでくれません。

たしか、TStringListは、読み込むときに、アスキーコードで$00〜$1Fまであたりで切れてしまうはず。
バイナリエディタで開くと、669文字あたりに、$00〜$1Fのコードがあると思われます。

となると、TFileStreamを使って確実にデータを読み上げ、加工するしかないような気がします。

> 変換するファイルを一度、何かのエディタ(メモ帳等)で開いて上書き保存すると、
Windows標準のメモ帳は、勝手にコード変換をかけて、$00〜$1Fを$20(=半角スペース)に変えてしまうはずです。
以前、大きなデータをメモ帳で削って保存し直したら、エラーがでなくなり、
消えたエラーでデバックに苦しんだ記憶があります。
MS製アプリは、よけいなことをする機能があって怖い。


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

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






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