• 締切済み

行の途中のデータを置き換えたい

データファイルが、 ”key01”-”車”-”ハンドル” ”key02”-”スポーツ”-”サッカー”    : なるファイルがあって、key01やkey02はこのファイルのキーと します。ここで、”key02”-”スポーツ”-”野球”という 新たなデータが出現し、key02が一致するので、ファイルの 内容を ”key01”-”車”-”ハンドル” ”key02”-”スポーツ”-”野球”のように書き換えたい    : のです。もちろん他の行は影響なしとしたいのですが、どのような 方法があるでしょうか。

みんなの回答

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

補足要求 1.”key01”-”車”-”ハンドル”の ”と-は、半角で間違いないでしょうか。 2.念のために、あなたが、実行したプログラムを 提示していただけでしょうか。その際、プログラムをコピーして、 張り付けて下さい。(手入力で転記すると、間違いがありますので) 3.データも差し支えなければ、提示して下さい。

yuyu_3
質問者

お礼

ありがとうございます。解決しました。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

以下のようにしてください。 --------------------------------- #入力ファイル datafileとすると $inf = "datafile"; open FIN,"$inf" or die "open error1:$inf"; #全行読み込み @lines = <FIN>; close(FIN); #ここで $key,$kind,$partが与えられているとする $key = '"key02"'; $kind = '"スポーツ"'; $part = '"野球"'; # $keyに一致する行を検索jする for ($i = 0; $i < scalar(@lines); $i++){ @elm = split('-',$lines[$i]); if ($elm[0] eq $key){ #一致したなら、その内容を置き換えて、繰り返しを抜ける $elm[1] = $kind; $elm[2] = $part; $lines[$i] = join("-",@elm); $lines[$i] .= "\n"; last; } } #出力用にオープンし、全行を出力する open FOUT,">$inf" or die "open error1:$inf"; for ($i = 0; $i < scalar(@lines); $i++){ print FOUT $lines[$i]; } close(FOUT); ------------------------------------ $key,$kind,$partは直接値を入れて、確認しました。 ”と-は、半角のダブルクオートとハイフンと解釈しました。

yuyu_3
質問者

お礼

ありがとうございます。解決しました。

yuyu_3
質問者

補足

tatsu99さん、回答ありがとうございます。 そのままコーディングしましたが、ダメなようです。 毎回、ファイルの先頭位置にヒットしたKeyの1行が 追加されてしまいます。 どこがいけないのでしょうか。 ちなみに #出力用にオープンし、全行を出力する open FOUT,">>$inf" or die "open error1:$inf"; ともして見ましたが、ダメでした。。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

回答: いったん、そのファイルをすべて読み込み、該当する箇所のみを、変更します。 変更した後、その内容をファイルへ出力します。 補足要求: >ここで、”key02”-”スポーツ”-”野球”という新たなデータが出現し とありますが、これは、別のファイルに、このようなものが、出現するのですか?

yuyu_3
質問者

お礼

ありがとうございます。解決しました。

yuyu_3
質問者

補足

補足しますね。 最初にある ”key01”-”車”-”ハンドル” ”key02”-”スポーツ”-”サッカー”    : はファイルなのですが、次に出現する、 ”key02”-”スポーツ”-”野球”というのは画面からの情報 なのです。従って、ファイルではありません。 @rirekiという配列の中に”-”区切りで格納されるデータです。 もっといいますと、$key、$kind、$parts という引数によって 渡される値の集合です。

関連するQ&A