下記のように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);
ようはファイルに追記したいのですが、
上書きしないで、バックをとっておき、
別のところへ追記したバージョンを生成したいということです。
ご協力お願いします。
No.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)して、通常使用のフォルダに書き出します。
あってる?
No.1
- 回答日時:
失礼かとは思いますが、いろいろ書きます。
すみません。> それぞれにあるデータを足して
この足すとは演算処理なのか、追記処理のどちらでしょうか?
> 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");というのは
既存ファイルの内容にプラスして追記だとおもっていたのですが、
ちがうのですね!
それだけわかっただけでもかなりの収穫です。
ありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) あるフォルダーのファイルを違う親フォルダーのサブフォルダーに移したい 11 2023/02/15 19:00
- Visual Basic(VBA) VBA GetAttrについて教えてください 2 2022/12/22 15:25
- UNIX・Linux Linuxについて質問です。 以下のような設定をしたMakefileを作成するにはどう記述すればよい 1 2023/02/03 20:10
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- CGI CGIが読み書きするデータファイルのパーミッションはさくらのインターネットでは何にするべき? 1 2023/05/02 16:44
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
- PHP imageフォルダに、画像をリサイズして保存する時のファイル名を変更したい 1 2023/05/30 11:39
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- Visual Basic(VBA) Excel VBA でデータ転記について 1 2023/03/07 19:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
batファイルでrenameができませ...
-
エラー 'dir.h' : No such fi...
-
readdir()で得られるファイル・...
-
パスから最後のディレクトリだ...
-
一定時間が経過したフォルダの削除
-
chdirがうまくできない
-
LinuxのC言語で、ファイル名の...
-
ANSI Cでファイル名、ディレク...
-
テキストファイルの結合
-
ディレクトリのファイル作成を...
-
HTMLのフォームで画像と文...
-
ExcelをCSV書き出す場合のシー...
-
awkスクリプトでダブルクォーテ...
-
Perlの変数に文字数制限(容量...
-
ファイル全てを .xlsm に変更し...
-
while(<ハンドラ>) {} で行数を...
-
テキストデータから指定した1...
-
htaccessで特定のディレクトリ...
-
ReadLineでの読み出し行を指定する
-
1行がやたら長いテキストをバッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
batファイルでrenameができませ...
-
FindFirstFileとFindNextFileで...
-
ディレクトリの判別
-
Windowsで複数のファイルを同じ...
-
vba dir の相対パス
-
パスから最後のディレクトリだ...
-
chdirがうまくできない
-
テキストファイルの結合
-
dos変数の%~dp0は powershellで...
-
Perlで フォルダ内の全て...
-
readdir()で得られるファイル・...
-
makefileでファイルをコピー(...
-
C言語でファイル名を取得
-
サーバーにある特定の拡張子フ...
-
ディレクトリツリーの表示
-
ファイル名と更新日付の取得に...
-
Director拡張子
-
LinuxのC言語で、ファイル名の...
-
複数ファイルの読み込みについて
-
ディレクトリ名を取得したい
おすすめ情報