ファイル名のソート

こんにちは

フォルダ内に格納された1~100までの数字が付いたファイルを昇順に処理したいのですが、繰り返し処理を使うと1.10…と、期待する動きになりません。
そこで、昇順にファイルを取得する方法があればご教授いただきたいです。
※数字はファイルによって入る場所が異なります。

例)A1_sample.xlsx
A2_sample.xlsx
sample_1.xlsx
sample_2.xlsx
sample_10.xlsx
sample_11.xlsx
宜しくお願いいたします。

こんにちは

条件が広いので、すべてのケースを網羅することは難しいと思いますが、一定の条件下の元(例えばファイル名中に数字列は1か所のみ等)であれば例えば以下で動くと思います

files.OrderBy(Function(f) System.Text.RegularExpressions.Regex.Replace(System.IO.Path.GetFileNameWithoutExtension(f),"\d+",chr(9))).ThenBy(Function(f) if(System.Text.RegularExpressions.Regex.IsMatch(System.IO.Path.GetFileNameWithoutExtension(f),"\d+"),Int32.Parse(System.Text.RegularExpressions.Regex.Match(System.IO.Path.GetFileNameWithoutExtension(f),"\d+").Value),0)).ToArray()

Sample20220813-1.zip (3.4 KB)

お世話になっております。

お礼が遅くなり申し訳ございません。
何日悩んでも解けなかった問題でしたので大変助かりました。

追加での質問となってしまうのですが、
数字が含まれないファイル名が混ざっている場合エラーになってしまいます。
これを回避するには、最初に数字が含まれるかの条件式を書いて含まれていれば…と、実装すればよろしいのでしょうか?

お忙しい中大変恐縮ですがご確認お願いいたします。

こんにちは

数字が含まれないファイル名が混ざっている場合エラーになってしまいます。

例えば以下の様に数字が含まれていなくてもエラーにはならないと思いますが、どのようなファイル名に対して、どのようなエラーが出ていますでしょうか?

お世話になっております。
下記のエラーが発生しております。
(ネットに繋がらない環境のため、スクリーンショット等、実際の環境をお見せすることができず申し訳ございません。)

ファイル名 Test\2022\0813\test.xlsx
エラー 入力文字列の形式が正しくありません

こんにちは

同様の入力で試してみましたが、問題ありませんでした。

上記サンプルの式は、エラー発生時にファイル名を直接は特定できないと思いますが、どのように上記のファイルに問題があることを特定していますでしょうか?
またエラーが発生している式は上記サンプルの式でしょうか?

こんにちは。

原因を探すため、ファイルを減らしてきファイル名を特定しました。
また、条件式はYoichiさんから頂いたデータを使用しております。

データや式に問題は無いと思いますのでこちらでその他の原因調査をしたいと思います。

こんにちは

デバッグ実行して停止した際にLocalsパネルの$ExceptionDetails の内容を確認してみてください。なにか原因の手掛かりがあるかもしれません。(以下は例です)

こんにちは。

再度確認したところ、全角数字が入ることによりエラーが発生していることがわかりました。
この場合、2つ目の「file」に記入されている条件式を全角数字も取り入れるようにすればよろしいのでしょうか?

こんにちは

全角数字文字がある場合に例外が発生しているのでしたら、エラーの原因として妥当かと思います。
全角数字文字もソートの対象としたいのであれば、以下の式を試してみてください。

files.OrderBy(Function(f) System.Text.RegularExpressions.Regex.Replace(System.IO.Path.GetFileNameWithoutExtension(f),"\d+",chr(9))).ThenBy(Function(f) if(System.Text.RegularExpressions.Regex.IsMatch(System.IO.Path.GetFileNameWithoutExtension(f),"\d+"),Int32.Parse(StrConv(System.Text.RegularExpressions.Regex.Match(System.IO.Path.GetFileNameWithoutExtension(f),"\d+").Value,VbStrConv.Narrow,&H411)),0)).ToArray()

こんにちは。

正常に動くことが確認できました。
自分だけでは絶対に解決できない問題だったので本当に感謝しております。

ありがとうございました。

1 Like

This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.