ファイル名から文字列抜き出し 文字列を含むファイル数を取得したい

こんにちは。
以下の操作を行いたく、どなたか教えていただけないでしょうか。

・変数 FilePath String
・変数 FileName String
・変数 Bangou String

1.特定フォルダからFilePath一覧を取得
2.FilePath(0).Split(""c)でFileName(ファイル名)を取得(代入使用)
3.Bangouに、7桁の文字列を代入
(例:ファイル名=「編集33B4567取得.pdf」→「33B4567」 この場合、特定文字=B)
4.Bangouをファイル名に含むファイルが、特定フォルダにいくつあるか知りたい

1、2を設定しましたが、
3で「Substring」や「IndexOf」を使い取得しようとしますが、うまく取得できません。
4は3でBangouを取得できたとしても、どのように特定フォルダ内のファイルと照合するか分かりません。

こんにちは

ファイル名の記述ルール(抽出したい箇所のルール)をもう少し明確にした方が
良いかと思います。
7桁の文字列は必ず3文字目から始まるのでしょうか?あるいは任意の場所にある可能性があるのでしょうか?
特定文字Bとは7桁の文字列に必ずBが含まれるという意図でしょうか?
複数の例をあげていただくとより良いかもしれません

抽出したい箇所について追記します。
(例)24B0987.pdf / お願い28B8764ブロック.pdf など
・「特定文字」=B(変更なし)
・「特定文字B」の前2文字、後4文字は、必ず半角英数字
・「特定文字B」が前からor後から何文字目にあるかは不規則です

助言頂き有難う御座いました。
追記してみました。

こんにちは

FilePath = System.IO.Directory.GetFiles("C:\temp","*.*")

FileName = FilePath.Select(Function(f) System.IO.Path.GetFileNameWithoutExtension(f)).Where(Function(f) System.Text.RegularExpressions.Regex.IsMatch(f,"(^|\D)\d{2}B\d{4}(\D|$)")).ToArray

とすると、FileNameに上記条件のファイル名一覧が格納されます。
単にトータルの件数が欲しければこれのLengthをとれば良いかと思います。

1 Like

早速の回答有難う御座いました。
実行すると、確かにFileName=条件に合うファイル数(ファイル名)を得られました。

私の説明が拙く、申し訳ないのですが、
①FileNameから、特定文字Bを3文字目に含む7文字を、変数Bangouに格納し(後の処理の為)
②Bangouを含むファイルが、一覧を取得したフォルダにいくつあるかを知りたいです
(例)24B0987.pdf/24B0987格納.pdf/24B0990.pdfがフォルダにあれば、
結果は2というように
その後、2以上と1以下で作業を分岐したいです

こんにちは

この部分が理解しにくいのですが、
24B0987 が 2
24B0990 が 1
という意味ではないのでしょうか?
最大値をとるということでしょうか?

1 Like

返信遅くなりました。申し訳ありません。

仰る通りです。
教えて頂いた式だと、
(例)に示したような「特定文字Bを含むファイル」のファイル名(数)を全て取得できるのは理解できました。
(←私が書いたタイトルの通りですが、短くするように言われ、削除した部分がありました。
正しくは、ファイル名から文字列を抜き出し、抜き出した文字列と全く同じ文字列を含むファイル数を取得したいです)

最終的には、

FileName=24B0987.pdf/24B0987格納.pdf/24B0990.pdf/24B0905.pdf/24B0905格納.pdf/24B0905格納2.pdf

となった場合、

①24B0987.pdf/24B0987格納.pdfを別フォルダに移動→作業
②FilePath、FileNameを取得し、24B0990.pdfは同じ文字列をもつファイルがないので無視
③FilePath、FileNameを取得し、24B0905.pdf/24B0905格納.pdf/24B0905格納2.pdfを
別フォルダに移動→作業

というように、同じ7桁の文字列を含むファイルだけをまとめて移動させ、作業したいです。
この同じ7桁の文字列を含むファイルだけをピックアップ(数を数えて)して、2以上の時だけ移動させるにはどうしたらいいか悩んでいます。

②24B0990.pdfは、時間が経過すれば、依頼24B0990.pdfのように同じ文字列をもつファイルが
必ずフォルダに追加されるので、追加されれば、これも別フォルダに移動し、作業したいです。

長々と申し訳ありません。
助けて頂けると本当に有難いです。よろしくお願いします。

こんにちは

例えば、以下のような感じにすると材料がそろうと思います。

FilePath=System.IO.Directory.GetFiles("C:\temp","*.*")
FilePath=FilePath.Where(Function(f) System.Text.RegularExpressions.Regex.IsMatch(System.IO.Path.GetFileNameWithoutExtension(f),"(^|\D)\d{2}B\d{4}(\D|$)")).ToArray()
dict = FilePath.GroupBy(Function(f) System.Text.RegularExpressions.Regex.Match(System.IO.Path.GetFileNameWithoutExtension(f),"(?<=^|\D)\d{2}B\d{4}(?=\D|$)" ).Value).ToDictionary(Function(g) g.Key,Function(g) g.ToArray())

Main.xaml (7.6 KB)

1 Like

何から何まで本当に有難う御座います。
早速、XAMLファイルに追加してみました。

全く同じようにしましたが、メッセージボックスに以下のようなエラーが表示されてしまいます。
どうしたらよいでしょうか。

変数dictに何が格納されているのかさえ、もう理解できず、すみません。
(会社の締切があるので、まず仕上げてしまってから、後日教えて頂いた式の読解をしたいと思います)

こんにちは

繰り返しのTypeArgumentがobjectのままになっていることが原因かと思います。
KeyValuePair<String,String[]>にしてみてください。

前の投稿でサンプルxamlをつけておりましたが、こちら動作しませんでしたでしょうか?
あわせて確認いただければと思います。

こんにちは

返信が遅くなり申し訳ありません。
何から何までありがとうございます。
無事に目指していたことができました。
本当にありがとうございました。

何度もすみません。
メッセージボックスで、7文字:それを含むファイル数:それを含むファイルのフルパスがとれたのですが、
繰り返しの中ではなく、繰り返しの外で、7文字やファイル数、フルパスを使用したいのですが、どうしたらよいでしょうか。
7文字を変数Bangouにいれるため、
代入 item=Bangouやdict=Bangouなどとしてみましたが、
どれもうまくいきません。

こんにちは

基本的には dictにすべての情報が格納されているので、ここから引き出すことができます。
ループの外とのことですが、どのように使いたいのでしょうか?
例えば、あらかじめ7桁番号がわかっている状態であれば

dict("1234567")

とすれば、ファイルパスが格納された配列が返ってきます。

こんにちは
文章でうまくお伝え出来ずすみません。
理想はこうしたいです。

こんにちは

趣旨がよくわかりませんが、
7桁の番号は複数ありうると思いますが、これは一つ目だけを処理できれば
良いのでしょうか?よくあるケースは、存在するすべての7桁番号を処理するように思えますので
これをループの外で取得する意図がわかりにくいです。

また1つの7桁番号に対して、複数のファイルが紐づく形になりますので、こちらに関しても
基本的にはループが必要になるかと思います。このあたりも含めて、全体の構成を検討いただくと
良いかと思います。

こんにちは
仰る通りです。最終的にはすべての7桁番号を処理します。
1つ目の7桁番号がついたファイルを全て、別フォルダに移動し、
それを用いて様々な処理を行います。
それが終了したら、またフォルダに戻ってきて、次の7桁番号を取得して、フォルダに移動して、処理を行います。この繰り返しで、7桁番号を含むファイルが無くなる迄処理をします。

なんとかここまでお知恵を貸していただけないでしょうか。

こんにちは

そうであれば、ループの外に出す必要はなく
ループの中でitem.Keyのまま使っても良いかとおもいますし、どうしてもbangouに代入したければ

bangou = item.Key

とすれば良いかと思います。

これに紐づくファイルは複数ありますので、
これを処理するためにこの内側にさらに繰り返しアクティビティが必要になります。
item.Value に対して繰り返しを行えば、個々の要素はファイル名になりますので
ファイル名に対しての拡張子チェックを行い、該当するものであれば
移動処理を行えばよいかと思います。

こんにちは

やはりループの外に出すことはできないですか。
できないことが分かり、次に進められそうです。

色々とご教示頂き本当にありがとうございました。

こんにちは

出せる・出せないという可能性の観点では「出せる」と思いますが、
要件から、「出す必要がないのでは?」と申し上げています。

「出す」のであれば、それなりのロジックを組む必要があると思いますが、
そのあたりが不明確に思えましたので、出さないことをお勧めしました。