お世話になります。
@で区切られた以下のようなファイル名の連番(Number)をリネーム処理しようとしています。
Name1@Code1@Name2@Code2@Code3@Number1@Number2@Ver.txt
Number1、Number2は3桁表示の連番で、Number1の連番を1つ大きいものにし、Number2は"001"に戻します。
よって、次のようになればOKです。
元:Name1@Code1@Name2@Code2@Code3@003@002@Ver.txt
→Name1@Code1@Name2@Code2@Code3@004@001@Ver.txt
そこで、このようなコードを書いてみました。
#!/usr/bin/perl
use File::Copy;
my $dir = "./";
opendir DH,$dir or die;
my @file = readdir DH;
foreach my $file(@file){
next if $file =~ /^\.{1,2}$/;
@fact = split /\@/,$file;
$rep = sprintf("%03d",$fact[5]+1);
$Origine = "$fact[0]\@$fact[1]\@$fact[2]\@$fact[3]\@$fact[4]\@$fact[5]\@$fact[6]\@$fact[7]";
$Replace = "$fact[0]\@$fact[1]\@$fact[2]\@$fact[3]\@$fact[4]\@$rep\@001\@fact[7]";
# print "前 : $Origine\n";
# print "後 : $Replace\n";
move( $Origine,$Replace );
}
closedir DH;
printさせて確認する限りではうまく動いているのですが、肝心のリネームの方は、1つのファイルしか処理されません。
何かご指摘頂けると幸いです。
また、同じ処理できれいなコードの書き方(方法)があれば教えてください。
初心者にはこのようなコードしか思いつきませんでしたので・・・
宜しくお願い致します。
No.2ベストアンサー
- 回答日時:
あ, たぶんわかった.
「shift-jis だと全角スペースが 8140 だから @ を含んでいるように見える」
ということかな.
Perl のバージョンにもよるけど, 一度適当な文字コードに変換してから split やなんかを実行し, 再度 shift-jis に戻して move するのが安全かな.
あと, 「$file をそのまま使うと無理やりリネームされてしまう」ということについては「処理の対象ではないファイルについてはあらかじめ除外しておく」のが正しいと思います. 今でも「.」とか「..」は初めから除外してますよね. これと同じように, たとえば
next unless ($file =~ tr/@//) == 8;
とかすればいいと思います.
> 「shift-jis だと全角スペースが 8140 だから @ を含んでいるように見える」
ご名答でした。
Encodeを使って、Windows上からも正常に動作しました。
> next unless ($file =~ tr/@//) == 8;
まだ書いてある通りの事しか出来ないので、非常に助かります。
(Encodeを書く順序を間違えて、ここでもしばらく引っかかってしまいましたが・・・)
ありがとうございました。
~ 完成形 ~
#!/usr/bin/perl
use utf8;
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";
use File::Copy;
use Encode;
my $dir = "./";
opendir DH,$dir or die;
my @file = readdir DH;
closedir DH;
foreach my $file(@file){
Encode::from_to($file,"cp932","utf8");
next if $file =~ /^\.{1,2}$/;
next unless ($file =~ tr/@//) == 7;
my @fact = split /\@/,$file;
my $rep = sprintf("%03d",$fact[5]+1);
my $Replace = "$fact[0]\@$fact[1]\@$fact[2]\@$fact[3]\@$fact[4]\@$rep\@001\@D\.xfdf";
Encode::from_to($file,"utf8","cp932");
Encode::from_to($Replace,"utf8","cp932");
move( "$file","$Replace" );
}
No.1
- 回答日時:
う~ん, 見た目ではそんなにおかしい気はしないなぁ....
「1つのファイルしか処理されません」と書かれていますが,
・処理されたファイルは, 最初のものなのか最後のものなのかあるいは途中のどれかなのか
・処理されなかったファイルはどうなるのか
・アクセス権などは大丈夫か
というところは補足できますでしょうか?
プログラムに手を入れるなら
・スペルミスを直す: Origine じゃなくて Origin
・そもそも $Origine と $file は同じでは?
・closedir は readdir の直後にあるべきのような気がする
というところから手をつけるかな. 無理すれば
($Replace = $file) =~ s/((?:[^@]*@){5})(\d+)@\d+(@.*)$/$1 . sprintf("@%03d@001", $2+1) . $3/e;
と書ける... けどうれしいかどうかは不明.
この回答への補足
Tacosan様、解答ありがとうございます。
コード自体はおかしくないとの事で、少し安心しました。
新たに気付いた事ですが、Name1...などに日本語、全角スペースを含むものがあり、それが原因のようです。
用意したサンプルのうち、処理可能な適切なファイル名なのが、その"1つのファイル"だったようです。
また、同じ日本語でも処理できるものとできないものがあるようで・・・。
処理可能なファイル名に変更してやると、正常に動作しました。
> そもそも $Origine と $file は同じでは
$fileだと同じディレクトリ内の全てのファイル、フォルダまで無理やり$Replaceの形にされてしまうので、
置き換えてた方が良さそうです。
スペルミスはお恥ずかしいかぎり・・・。
> ($Replace = $file) =~ s/((?:[^@]*@){5})(\d+)@\d+(@.*)$/$1 . sprintf("@%03d@001", $2+1) . $3/e;
あまり嬉しくなさそうですが、参考になります。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- 英語 "seperate A from B"のAとBの関係性(時系列や包含関係)とその理由等について 1 2023/05/17 16:23
- 英語 提示文の構造について 6 2022/08/25 10:40
- 英語 提示文の構造について(名詞+be that V?) 2 2023/05/19 09:46
- 英語 動詞のカウントに注意というところで。 was an American が1つ目の動詞とありますが、 1 2022/05/30 04:27
- その他(プログラミング・Web制作) VS codeを使って、ラズパイ Picoを動かせる簡単な方法 1 2023/04/27 13:49
- 英語 「to不定詞」を目的語に直接取れない動詞で、なお「to不定詞」で表現したい場合の方法について 2 2022/07/11 10:17
- TOEFL・TOEIC・英語検定 TOEIC公式問題集7に掲載の英文で質問があります。 どなたか教えていただけますようお願いいたします 6 2022/11/08 05:43
- その他(コンピューター・テクノロジー) <a href="file:///フォルダ名/ファイル名">リンクテキスト</a>について 1 2023/04/06 22:40
- PHP $_SESSIONについて教えて下さい。 4 2023/03/13 13:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perlをバージョンアップしたら...
-
INDIRECT 横に再度抽出したい
-
Strawberry Perl for Windows ...
-
openした後、closeしないでプロ...
-
テキストファイルで提出とは?
-
Perlのエラーについてご教授く...
-
perlのrequireの動き方について...
-
Perl の外部モジュールの利用方法
-
Windows10においての『Perl』の...
-
Perlで特定文字列から特定文字...
-
Perlでsprintf("%02d",$month)...
-
フローチャート 九九
-
perl LWPでURLにアクセスした時...
-
Perlで、「が」を、「...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
INDIRECT 横に再度抽出したい
-
perlをバージョンアップしたら...
-
openした後、closeしないでプロ...
-
Perlで特定文字列から特定文字...
-
Wallpaper Engineでおすすめの...
-
Perlのエラーについてご教授く...
-
アルファベットに付いて質問し...
-
Strawberry Perl for Windows ...
-
bashスクリプト
-
テキストファイルで提出とは?
-
Perl の外部モジュールの利用方法
-
#!/usr/bin/perlで書きだしたCG...
-
Windows10においての『Perl』の...
-
perlのflock関数でロックをかけ...
-
perlで2次元配列をサブルーチ...
-
Perlで時間の計算
-
perlのrequireの動き方について...
-
画像が表示でnull; this.src
-
ターミナルで特定の文字と文字...
-
英数文字列のうちの数値を4桁に...
おすすめ情報