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

解決


モーメント  2004-03-31 23:20:15  No: 8109  IP: [192.*.*.*]

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

編集    削除
るるとん@K  URL  2004-03-31 23:30:12  No: 8110  IP: [192.*.*.*]

よくわからん

編集    削除
take  2004-03-31 23:39:29  No: 8111  IP: [192.*.*.*]

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

編集    削除
モーメント  2004-03-31 23:39:54  No: 8112  IP: [192.*.*.*]

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

編集    削除
Fazz  2004-03-31 23:56:18  No: 8113  IP: [192.*.*.*]

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

編集    削除
るるとん@K  2004-04-01 00:03:24  No: 8114  IP: [192.*.*.*]

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

編集    削除
モーメント  2004-04-01 00:11:28  No: 8115  IP: [192.*.*.*]

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

編集    削除
モーメント  2004-04-01 00:31:53  No: 8116  IP: [192.*.*.*]

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

編集    削除
Fazz  2004-04-01 02:22:55  No: 8117  IP: [192.*.*.*]

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

編集    削除
モーメント  2004-04-03 00:47:42  No: 8118  IP: [192.*.*.*]

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  IP: [192.*.*.*]

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

編集    削除
るるとん@K  2004-04-03 01:03:14  No: 8120  IP: [192.*.*.*]

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

編集    削除
モーメント  2004-04-03 01:03:46  No: 8121  IP: [192.*.*.*]

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

編集    削除
モーメント  2004-04-03 01:20:21  No: 8122  IP: [192.*.*.*]

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

編集    削除
るるとん@K  2004-04-03 01:27:21  No: 8123  IP: [192.*.*.*]

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

編集    削除
take  2004-04-03 02:00:13  No: 8124  IP: [192.*.*.*]

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  IP: [192.*.*.*]

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

編集    削除