プロが教える店舗&オフィスのセキュリティ対策術

20180122A0223AAA001.csv
20180122T0223AAA002.csv
20180122P0322AAA001.csv
20180122A0222DDD001.csv
20180122A0123CCC001.csv

上のようなファイルが複数存在する場合、ファイル名にAAAの記載があるファイルを検索。
そのファイルの10桁目からファイル名に記載されている日付のフォルダを作成。
そのフォルダ配下にAAAの記載があるファイルのみコピーを行う。

今回の場合は、AAAがファイル名に含まれるファイルの”ファイル名から”「0223」「0322」のフォルダを作成後、そのフォルダ配下に「20180122A0223AAA001.csv」「20180122T0223AAA002.csv」の二つのファイルを「0223」フォルダにコピー。「20180122P0322AAA001.csv」は「0322」フォルダにコピーを行う一連の処理をperlで書きたいと思います。よろしくお願いします。

質問者からの補足コメント

  • 書きたいと思っていますが書けていません。努力、才能が足りないと言われればそうかもしれませんが教えてもらえるとありがたいです。教えてください。よろしくお願います。

      補足日時:2018/02/24 02:45

A 回答 (2件)

OSが不明なのでwindows前提です。


以下のようにしてください。
------------------------
use strict;
my $datadir = "d:\\goo\\perl\\goo3";
chdir($datadir) or die("chdir error:$!");
opendir(DIRH, ".") or die("opendir error:$!");
my @files = readdir(DIRH);
closedir(DIRH);
@files = grep(/^\d{8}\w\d{4}AAA\d{3}\.csv$/i,@files);
my $ctr = 0;
foreach my $fname (@files){
my $sdir = substr($fname,9,4);
-d $sdir or mkdir($sdir,0777) or die("mkdir error:$!");
my $newname = $sdir . "\\" . $fname;
rename($fname,$newname) or die("rename error:$!");
$ctr++;
}
printf("%d files moved!!\n",$ctr);
-------------------------------------
my $datadirはこれらのファイルを格納しているフォルダです。あなたの環境にあわせて適切に設定して下さい。
    • good
    • 0
この回答へのお礼

substrを使ってできました。本当にありがとうございました。

お礼日時:2018/02/25 03:37

「書きたい」というなら書けばいいと思うんだけど, なにが問題なんでしょうか?

    • good
    • 0
この回答へのお礼

書きたいと思っていますが、今の自分では書けません。
また、質問の文章になっていませんでした。努力、才能が足りないと言われればそうかもしれませんが教えてもらえるとありがたいです。教えてください。よろしくお願います。

お礼日時:2018/02/24 02:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!