以下のようなファイル名が複数あります。
abcd_021106_0.txt
abcd_021106_1.txt
abcd_021106_2.txt
abcd_021106_11.txt
これを @list = glob("abcd_021106_*");で
取得すると、配列には、
(0) abcd_021106_0.txt
(1) abcd_021106_1.txt
(2) abcd_021106_11.txt
(3) abcd_021106_2.txt
というふうに格納されてしまいます。
これではまずいので、きちんと末尾の順番どおり
sort するには どのようにすればいいのでしょうか。
よろしくご指南ください。
No.2ベストアンサー
- 回答日時:
急いで書いたので可読性が悪く、極意と言うほど一般化できませんでしたが、下記で出来ますよ。
ファイル名の形式が、「文字列_数字_数字.拡張子」となっている場合しか使えません。
形式が違う場合は、正規表現と、<=>、cmpを入れ替えて使ってください。
@orglist = glob("abcd_021106_*");
foreach (@orglist) {
my ($nofi) = $_ =~ m/^(\w+)\.\w+$/;
push(@tmplist, [$_, split("_", $nofi)]);
}
@newlist = sort {$a->[1] cmp $b->[1] || $a->[2] <=> $b->[2] || $a->[3] <=> $b->[3]} @tmplist;
@list = ();
foreach (@newlist) {
push(@list, $_->[0]);
}
この時点で、@listに期待した順番でファイル名が入っているはずです。
スクリプトまでご紹介くださり、ありがとうございます。
そのまま貼り付ける形で実行できることを確認しました。
貴重な時間を割いていただき、感謝いたします。
No.3
- 回答日時:
ご要望のソートは、次のスクリプトで実現できます。
@list = map {$_->[0]} # 3
sort {$a->[1] <=> $b->[1]} # 2
map {[$_,/^abcd_\d{6}_(\d+)/]} @list; # 1
これは、
1.元データと末尾の数値からなる"無名配列のリスト"を生成
2.末尾の数値で"無名配列のリスト"をソート
3.ソートされた"無名配列のリスト"から、元データを取り出す
という流れになっています。
ファイルの命名規則が「名前_日付_番号.txt」となっているようですので、これを「名前順 かつ 日付順 かつ 番号順」でソートする場合、次のようにします。
@list = glob("*_*_*.txt"); # globのパターンも変える
@list = map {$_->[0]}
sort {$a->[1] cmp $b->[1] || $a->[2] <=> $b->[2] || $a->[3] <=> $b->[3]}
map {[$_,/^([a-z]+)_(\d{6})_(\d+)/]} @list;
アルゴリズムについては、参考URLのページもご参考ください。
参考URL:http://www.din.or.jp/~ohzaki/perl.htm#SortST
スクリプトと詳細に解説していただき、ありがとう
ございます。ご紹介いただいた URL も 大いに参考に
なりました。自分でも探したつもりでしたが、見つける
ことができませんでした。
貴重な時間を割いていただき、感謝いたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) ファイル名の一部をbatで変更したい batファイルを使って、以下のようにファイル名の一部を変更した 3 2023/02/21 20:09
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- UNIX・Linux Linuxについて質問です。 以下のhistoryの出力結果から、sedコマンドのファイル名tmp1 1 2023/02/03 20:11
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/03 13:18
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/02/05 09:55
- 数学 数学B 私の回答はあっていますか? A(1,3), B(2,5), C(6,8), D(5,6), 8 2022/05/22 00:55
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 入力待ちをして、受け取った正の整数が表す行数だけ既存 4 2022/07/05 10:12
- 画像編集・動画編集・音楽編集 medibang での文字の整列の仕方 1 2023/06/02 06:38
- 数学 数学の質問です。 円に内接する四角形ABCD において, AB=2, BC = 1, CD = 3, 3 2023/04/18 18:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# Process.Startメソッドで複...
-
DOSコマンドのダブルクォーテー...
-
VBからファイル・アプリケーシ...
-
Access2003でレポートのラベル...
-
拡張子はなぜ、大文字と小文字...
-
Androidアルバムの画像を消去で...
-
コマンドプロンプトで出来ること
-
フォルダの中に1個しかファイ...
-
フォルダの並び替えの項目を固...
-
ひとつのファイルを一括で複数...
-
エクセルでの計算式もしくはシ...
-
Windowsフォルダ内のファイルと...
-
iPhoneのメモ帳が重いです。メ...
-
XCOPYで指定したフォルダとファ...
-
複数のフォルダへ同時にファイ...
-
ユーザフォルダー内のフォルダ
-
フォルダーのプロパティで表示...
-
パソコン、ワンドライブをプリ...
-
ドナルドウズを消す。
-
windows (ウィンドウズ) の 「...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# Process.Startメソッドで複...
-
C# 特定文字列まで削除の方法
-
cshで拡張子を除いたファイル名...
-
VBからファイル・アプリケーシ...
-
DOSコマンドのダブルクォーテー...
-
リストボックスのテキストを保存
-
sort の極意
-
ソート処理
-
VBSでコマンド発行したいが・・・
-
ファイル処理でのファイル指定...
-
API FtpPutFileの戻り値
-
findstrで複数ファイルを検索す...
-
powershellでのソート
-
複数のテキストファイルを結合...
-
改行コードについて vbNewLine
-
DOSコマンド【COPY】
-
Androidアルバムの画像を消去で...
-
拡張子はなぜ、大文字と小文字...
-
フォルダの並び替えの項目を固...
-
ひとつのファイルを一括で複数...
おすすめ情報