- 締切済み
行の途中のデータを置き換えたい
データファイルが、 ”key01”-”車”-”ハンドル” ”key02”-”スポーツ”-”サッカー” : なるファイルがあって、key01やkey02はこのファイルのキーと します。ここで、”key02”-”スポーツ”-”野球”という 新たなデータが出現し、key02が一致するので、ファイルの 内容を ”key01”-”車”-”ハンドル” ”key02”-”スポーツ”-”野球”のように書き換えたい : のです。もちろん他の行は影響なしとしたいのですが、どのような 方法があるでしょうか。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- tatsu99
- ベストアンサー率52% (391/751)
補足要求 1.”key01”-”車”-”ハンドル”の ”と-は、半角で間違いないでしょうか。 2.念のために、あなたが、実行したプログラムを 提示していただけでしょうか。その際、プログラムをコピーして、 張り付けて下さい。(手入力で転記すると、間違いがありますので) 3.データも差し支えなければ、提示して下さい。
- tatsu99
- ベストアンサー率52% (391/751)
以下のようにしてください。 --------------------------------- #入力ファイル 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は直接値を入れて、確認しました。 ”と-は、半角のダブルクオートとハイフンと解釈しました。
お礼
ありがとうございます。解決しました。
補足
tatsu99さん、回答ありがとうございます。 そのままコーディングしましたが、ダメなようです。 毎回、ファイルの先頭位置にヒットしたKeyの1行が 追加されてしまいます。 どこがいけないのでしょうか。 ちなみに #出力用にオープンし、全行を出力する open FOUT,">>$inf" or die "open error1:$inf"; ともして見ましたが、ダメでした。。
- tatsu99
- ベストアンサー率52% (391/751)
回答: いったん、そのファイルをすべて読み込み、該当する箇所のみを、変更します。 変更した後、その内容をファイルへ出力します。 補足要求: >ここで、”key02”-”スポーツ”-”野球”という新たなデータが出現し とありますが、これは、別のファイルに、このようなものが、出現するのですか?
お礼
ありがとうございます。解決しました。
補足
補足しますね。 最初にある ”key01”-”車”-”ハンドル” ”key02”-”スポーツ”-”サッカー” : はファイルなのですが、次に出現する、 ”key02”-”スポーツ”-”野球”というのは画面からの情報 なのです。従って、ファイルではありません。 @rirekiという配列の中に”-”区切りで格納されるデータです。 もっといいますと、$key、$kind、$parts という引数によって 渡される値の集合です。
お礼
ありがとうございます。解決しました。