テキストファイルの内容を変更して、別の場所に保存するには?

解決


モーメント  2004-03-31 23:20:15  No: 8109

一度テキストファイルを別の場所にコピーして、出来たテキストファイルの
内容を変更して保存するのではなく、
読み込んできたテキストファイルの内容を変更して、
変更する前のテキストファイルは元の場所に残った状態で、
変更したテキストファイルを直接別の場所に保存することは出来ますか?


るるとん@K  URL  2004-03-31 23:30:12  No: 8110

よくわからん


take  2004-03-31 23:39:29  No: 8111

あえてソース例は書きません。
Delphiではというより他言語でもほとんどそうですが
ファイルの内容を書き換える場合、まずメモリに読み込んで
変更した後にファイルに保存します。
ですので読み込むときのファイル名と別のファイル名で書き込めば
元テキストファイルを残したまま書き換えて別ファイル名で保存できます。


モーメント  2004-03-31 23:39:54  No: 8112

説明がへたで申し訳ございません。
テキストファイルAがC:¥Aフォルダにあるとします。
このテキストファイルAの内容を変更する。
変更したテキストファイルAをC:¥Bフォルダに保存する。
C:¥Aフォルダには変更前のテキストファイルAが残ったまま存在する。
このようなことは出来ますか?


Fazz  2004-03-31 23:56:18  No: 8113

出来ます。(簡単に出来ます)
テキストファイル・ルーチンを使うなら、
AssignFileで指定するファイル名を読む時と書く時で変えます。
(テキストファイル・ルーチン以外の読み書き手段もありますが……)
でも文面を読むにつけ、
テキストファイルを扱った経験がおありかどうかが問題となります。
単純に読み書きをした経験はおありでしょうか?


るるとん@K  2004-04-01 00:03:24  No: 8114

TStringListで
LoadFromFile(ファイルA)
SavaToFile(ファイルB)
とか^^;


モーメント  2004-04-01 00:11:28  No: 8115

takeさん、Fazzさんレスありがとうございます。
>テキストファイルを扱った経験がおありかどうかが問題となります。
>単純に読み書きをした経験はおありでしょうか?
Delphiを使い始めて、まだ数日の超素人です。
ほかの言語も触れたことありません。
テキストファイルを扱った経験はまったくありません。
AssignFileというのを使えば出来るんですね。調べてみます。


モーメント  2004-04-01 00:31:53  No: 8116

るるとん@K さんレスありがとうございます。
参考にさせていただきます。


Fazz  2004-04-01 02:22:55  No: 8117

テキストファイル・ルーチンを使う場合、
AssignFileだけでは扱えませんのでご注意を。
(他の一連の手続きとセットで使います)
元々テキストファイル・ルーチンは原始的な手段であることもご注意を。
どの手段を使うにしても、
Aファイルを読み込んで編集して、
改めてBファイルに書き出すということになりますが、
Aファイルを読み込んで編集しても、
上書きしない限りはAファイルの内容は変わりません。


モーメント  2004-04-03 00:47:42  No: 8118

Tstringlistを使いなんとか、テキストファイルを読み出し、
別の場所へ保存できるようになりました。
続けて質問なんですが、例えば、テキストファイルのデータが
下記のように区切られている時、kを、Lに変えてファイルに保存するに
はどうすればいいのですか?

a,b,c,d,e,f,g
h,i,j,k,l,m,n
  ・
  ・
  ・
1,2,3,4,5,6,7


るるとん@K  2004-04-03 00:56:18  No: 8119

一応いいますがStringListは最後に.freeで解放してくださいね


るるとん@K  2004-04-03 01:03:14  No: 8120

>下記のように区切られている時、kを、Lに変えてファイルに保存するにはどうすればいいのですか?よく分かりませんが、文字列内のkをすべてLにするには
SLがTStringlistで
SL.Text:=StringReplace(SL.Text,'k','L',[rfReplaceALL]);
ですが、多分違うことがやりたいはず


モーメント  2004-04-03 01:03:46  No: 8121

るるとん@Kさんご忠告ありがとうございます。
ちゃんと.freeで解放しております。


モーメント  2004-04-03 01:20:21  No: 8122

>よく分かりませんが、文字列内のkをすべてLにするには
そういうことではなくて、もっと基本的であると思われる
カンマを区切と考えて、任意のm行目のカンマn個目の値を換えたいのです。


るるとん@K  2004-04-03 01:27:21  No: 8123

さぁ、どうやるんでしょうね^^;
https://www.petitmonte.com/bbs/answers?question_id=833
これじゃないすか?


take  2004-04-03 02:00:13  No: 8124

2次元的なテキストファイルをTStringListで扱うときは
こんな感じに1次元になおしながら処理して使う事が多いと思います。
でも根本的に他の方法を使った方が良いような気もします。

t1 := TStringList.Create;
t2 := TStringList.Create;
try
  t1.LoadFromFile(ファイル名A);
  for j:= 0 to t1.Count -1 do begin  // 行単位ループ
    t2.CommaText := t1[j];  // <- 1行分をカンマごとに分割
    for i:=0 to t2.Count-1 do begin   // カンマ区切り文字列ごとのループ
      if t2[i] = 'k' then t2[i] := 'L';  // 置換処理
    end;
    t1[j] := t2.CommaText;  // <- カンマ区切りに直す
  end;
  t1.SaveToFile(ファイル名B);
finally
  t2.free;
  t1.free;
end;


モーメント  2004-04-03 02:31:26  No: 8125

takeさん的確かつソースまで付けていただきありがとうございます。
おかげさまで解決できました。
>でも根本的に他の方法を使った方が良いような気もします。
他の方法とはTStringlistを使わないということですか?
この方法は何か問題があるんですか?


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

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






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