• ベストアンサー

ファイルの一部上書き

ファイルを読み込み、一部だけを上書きするにはどうすればよいのでしょうか? ↓果物:価格:在庫を表す。 <テキストファイル> オレンジ 100 1000 アップル 150 2000 バナナ 80 100 このファイルを読み込んで、在庫の数の部分だけを書き換えたいんです。 <書き換えた後> オレンジ 100 500 アップル 150 200 バナナ 80 30

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

実際の処理は、もうちょっと複雑なのでしょうが、 質問文の場合、 update.pl $F[2] = 500 if $F[0] eq "オレンジ"; $F[2] = 200 if $F[0] eq "アップル"; $F[2] = 20 if $F[0] eq "バナナ"; print "$F[0] $F[1] $F[2] \n"; で テキストファイルの名前がdata.txtの時 perl -i.bak -an update.pl data.txt でできます。 -i オプションは指定した拡張子に元のファイル名を変えてくれます。ファイルを上書きする時に、元が残っていた方が良い場合につけます。 -a オプションは、スペース(多分半角スペース)でデータが区切られている時、入力時に、@Fに分けて格納してくれます。(便利でしょ!) -n オプションは、スクリプト全体がwhileでくくられているかの様に実行してくれます。(ループを自分で書かなくても良いってことです。(便利でしょ!) ほんの4行のスクリプトでできるしね。

noname#13767
質問者

お礼

ありがとうございます。 なんとか解決しました。 勉強になりました。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • Dpop
  • ベストアンサー率51% (279/544)
回答No.3

#2 です。肝心な部分が消えてました。 #!/use/local/bin/perl use strict; my($master) = 'in1_data.txt'; my($tran) = 'in2_data.txt'; my($out) = 'out_data.txt'; my(%d1, %d2); &readfile($master, \%d1); &readfile($tran , \%d2); my($i, $j); foreach $i (sort keys %d1) { foreach $j (sort keys %{$d1{$i}}) { $d1{$i}{$j} = $d2{$i}{$j}; } } my(@o) = (); open(OUT, "> $out") || die "open error $out"; foreach $i (sort keys %d1) { @o = (); push(@o, $i); foreach $j (sort keys %{$d1{$i}}) { push(@o, $d1{$i}{$j}); } print OUT join(' ', @o). "\n"; } close(OUT); exit(0); sub readfile { my($f, $d) = @_; open(IN, $f) || die "open error $f"; while(<IN>) { chop; my($k, $a, $z) = split(/[  ]+/); $d->{$k}->{'kakaku'} = $a; $d->{$k}->{'zaiko'} = $z; } close(IN); }

noname#13767
質問者

お礼

アドバイスありがとうございます。 参考にさせていただきます。

すると、全ての回答が全文表示されます。
  • Dpop
  • ベストアンサー率51% (279/544)
回答No.2

例えば。。。 こんな感じで良いのかな。。。 #!/use/local/bin/perl use strict; my($master) = 'in1_data.txt'; my($tran) = 'in2_data.txt'; my($out) = 'out_data.txt'; my(%d1, %d2); &readfile($master, \%d1); &readfile($tran , \%d2); my($i, $j); my(@o) = (); open(OUT, "> $out") || die "open error $out"; foreach $i (sort keys %d1) { @o = (); push(@o, $i); foreach $j (sort keys %{$d1{$i}}) { push(@o, $d1{$i}{$j}); } print OUT join(' ', @o). "\n"; } close(OUT); exit(0); sub readfile { my($f, $d) = @_; open(IN, $f) || die "open error $f"; while(<IN>) { chop; my($k, $a, $z) = split(/[  ]+/); $d->{$k}->{'kakaku'} = $a; $d->{$k}->{'zaiko'} = $z; } close(IN); } マスター オレンジ 100 1000 アップル 150 2000 バナナ 80 100 トランザクション オレンジ 100 1000 アップル 150 2000 バナナ 80 100 結果 アップル 150 2000 オレンジ 100 1000 バナナ 80 100

すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

読み込んで、分解して、在庫を変更して 書き出す。 -aオプションなんかを使うと楽かも

noname#13767
質問者

補足

すいません。初心者なので、aオプションとは、どんなものかわかりません。教えていただけると嬉しいのですが。

すると、全ての回答が全文表示されます。

関連するQ&A