- ベストアンサー
ファイル読み込み・書き込み
下記のようにtestディレクトリ内のファイルを読み込み、 それぞれにあるデータを足して、 読み込んだファイルを他のディレクトリに書き出したいのですが、 どのようにしたらよいのでしょうか。 とりあえず、下記はファイルを読み込んで、 なにも足さずそのまま別のディレクトリに移すとこまで、 やりたいと思っていますが、 どうやっていいものか・・・ #!/usr/bin/perl $dir = "test/"; opendir(DIR, $dir); while($file = readdir(DIR)){ open(IN, ">>$dir$file"); @list = <IN>; foreach $dataLine(@list) { print IN $dataLine; } close(IN); } closedir(DIR); ようはファイルに追記したいのですが、 上書きしないで、バックをとっておき、 別のところへ追記したバージョンを生成したいということです。 ご協力お願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
一応これで動くかな?? 感じだけ掴み取ってください。動作テストしてないので。 $b_dir = "back_dir/"; #バックアップを置いておくディレクトリ $n_dir = "new_dir/"; #通常使用のディレクトリ $new_line = "追加したい項目"; opendir(DIR, $n_dir); while($file = readdir(DIR)){ $nfile="$n_dir$file"; # 一応わかりやすいように。。 $bfile="$b_dir$file"; #### ## まずはファイルテスト if (-T $nfile) { # テキストファイルかどうかチェック。 $n_dirにログファイルしか置かないのであれば、-Tじゃなくて-fでもいいかも。 ##### ## 読込み open(IN, $nfile); @list = <IN>; close(IN); ##### ## バックアップ出力 open(DB,">$bfile"); print DB @list; close(DB); ##### ## NEWライン出力 push(@list, $new_line); #新しいライン挿入 open(IN,">$nfile"); #いよいよ出力 print IN @list; close(IN); } else{next;} #ファイルテストに失敗したら、次いってみよ~。 } closedir(DIR); 通常使用のフォルダから読み取り、それはバックアップとして$bfileに書き出します。 そこに新しい項目を追加(push)して、通常使用のフォルダに書き出します。 あってる?
その他の回答 (1)
- x415f484f
- ベストアンサー率71% (57/80)
失礼かとは思いますが、いろいろ書きます。すみません。 > それぞれにあるデータを足して この足すとは演算処理なのか、追記処理のどちらでしょうか? > open(IN, ">>$dir$file"); これでは読み込みではなく追記書き込みしてしまいます。 open(IN, "<$dir$file"); としないと読み込みは出来ないです。 > どうやっていいものか・・・ 一度やりたいことを箇条書きにしてみてはどうでしょうか? > 上書きしないで、バックをとっておき、別のところへ追記した > バージョンを生成したいということです。 やりたいことは、次のことでしょうか? 1. バックアップの作成(単純に別ディレクトリへコピー) 2. ディレクトリ内のファイルの列挙 3. 列挙したファイルへの処理と保存 それといきなりファイル操作部分のコーディングをしてしまうので はなく「print "$dir$file\n";」等として、ファイルが列挙できて いるか確認する、それから open して読み込みができているか内容を print で出力して確認して……と、ステップを踏んだほうが良いかと 思いますが、いかがでしょう? それと $file に対してはテスト演算子の「-T」等を使って確認を しないと「.」や「..」というものまでファイルとして扱うことに なります。 if(-T $dir.$file){ # ファイルに対する処理 } ※ -T はテキストファイルであるかどうか調べるもの 余計なことかも知れませんが、 linux 環境なら `cp -a $dir $backupdir`; としてから、perl で $dir 内のファイルの処理を行うほうが perl で バックアップするより早いかと思います。
お礼
細かくご指摘いただいてありがとうございます。 なんとなくわかりました! open(IN, ">>$dir$file");というのは 既存ファイルの内容にプラスして追記だとおもっていたのですが、 ちがうのですね! それだけわかっただけでもかなりの収穫です。 ありがとうございました!
お礼
サンプルコードまでいただいてありがとうございます! 早速試してみます!