• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ファイル名からフォルダを自動作成し振り分ける)

ファイル名からフォルダを自動作成し振り分ける

このQ&Aのポイント
  • ファイル名からフォルダを自動作成し、ファイルを振り分ける方法について説明します。
  • ファイル名の一部を抽出し、同名のフォルダを作成し、ファイルを移動させる方法を紹介します。
  • batファイルを作成して、一括でファイルを振り分ける方法を解説します。

質問者が選んだベストアンサー

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

以下のコードをメモ帳に貼り付け、適当な名前で拡張子をvbsとして 保存し適当なところにおいてダブルクリックで実行してみてください。 なおコード中の、      strPath = "C:\Users\ユーザー名\Desktop\物置" のところは、デスクトップの物置というフォルダにファイルが 入っているようになっているのでそこのところだけ実際に ファイルが入っているフォルダのパスに書き換えてください。 保存したらダブルクリックしてみてください。 一応、ファイルの拡張子は質問の内容からjpgとしています。 違う拡張子ならば、コード中の、      If LCase(objFso.GetExtensionName(fil)) = "jpg" Then のところの"jpg"を目的のファイルの拡張子に合わせてください。 なお、設定したvbsファイルを変更する場合はファイルの上で 右クリックから編集をくりっくするとコードがでてきます。 Dim objFso Dim fil Dim strPath Dim strFolderName Dim numStart Dim numEnd Dim numLen strPath = "C:\Users\ユーザー名\Desktop\物置" Set objFso = CreateObject("Scripting.FileSystemObject") For Each fil In objFso.GetFolder(strPath).Files If LCase(objFso.GetExtensionName(fil)) = "jpg" Then numStart = InStr(fil.Name, "_") + 1 numEnd = InStr(numStart, fil.Name, "_") numLen = numEnd - numStart strFolderName = Mid(fil.Name, numStart, numLen) If objFso.FolderExists(strPath & "\" & strFolderName) = False Then objFso.CreateFolder (strPath & "\" & strFolderName) End If If objFso.FileExists(strPath & "\" & strFolderName & "\" & fil.Name) = False Then objFso.CopyFile strPath & "\" & fil.Name, strPath & "\" & strFolderName & "\" & fil.Name End If End If Next Set objFso = Nothing

noir96
質問者

お礼

ご回答ありがとうございます 実行してみたところ、想定した通りの動作となりました! ベストアンサーとさせていただきます。 大変感謝しております! ありがとうございました

その他の回答 (2)

noname#251971
noname#251971
回答No.2

こういった、決まったパターンの文字列を処理したいという場合には「正規表現」というものを利用すると便利かと思います。 ちなみに正規表現は環境やプログラミング言語によってルールが違うため、利用する場面ごとに書式を調べる必要があります。 プログラムを作るとした場合、個人的にはC#をお勧めします。 プログラミングの入門にはスクリプト言語が薦められることも多いかとは思いますが、私としては、強い型付けがあってプログラムの実行前にある程度エラーを示してくれるコンパイル言語こそ、入門にふさわしいと思っています。 自分が一番気に入っている言語というのもありますが、C#は書きやすいくライブラリの機能も豊富で、ちょっとしたツールから規模の大きなものまでなんでもこなせるかと思います。 本当はVisual Studio 2017 Expressのような無償で高機能な開発環境を使うとよいのですが、 本件ぐらいの用途であれば、OS(.NTE Framework)に付属しているコンパイラを利用して済ませてしまうこともできます。 たとえば、コードはこんな感じで。 ----- using System; using System.IO; using System.Text.RegularExpressions; namespace ClassifyTool { class Program { static void Main(string[] args) { try { var argSrcDir = (0 < args.Length) ? args[0] : null; var argDestDir = (1 < args.Length) ? args[1] : null; if (!Directory.Exists(argSrcDir)) { throw new Exception("Illegal src directory"); } if (!Directory.Exists(argDestDir)) { throw new Exception("Illegal dest directory"); } var srcDir = new DirectoryInfo(argSrcDir); var destDir = new DirectoryInfo(argDestDir); var targetPattern = new Regex(@"^\d{8}_(.+?)_.+?_.+?\..*$"); foreach (var srcFile in srcDir.EnumerateFiles()) { var match = targetPattern.Match(srcFile.Name); if (!match.Success) { continue; } var subDir = match.Groups[1].Value; var destSubDir = destDir.CreateSubdirectory(subDir); var destPath = Path.Combine(destSubDir.FullName, srcFile.Name); srcFile.MoveTo(destPath); } } catch (Exception ex) { Console.Error.WriteLine(ex.Message); } } } } ----- そして、以下のような感じで利用します。 1) 上記コードをメモ帳にコピペして、「classifytool.cs」のような名前を付けてファイルに保存。 2) コマンドプロンプトで以下のようにして付属コンパイラ(csc.exe)を使ってコンパイルします。  C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe classifytool.cs 3) 出来た classifytool.exe を以下のような感じで移動元と移動先の基準ディレクトリを渡して呼び出し。  classifytool.exe "c:\元フォルダ" "c:\移動先フォルダ" すると、移動先フォルダの配下にサブフォルダが作られてその中に分類されます。 # 質問文から読み取れた情報のみで記述したので、質問者さんの想定外の動作にならないかどうかは保証しかねます。 コードはなるべく平易な書き方をしてみたつもりなので、英単語がわかればプログラムを知らなくても普通にやってることもある程度わかるのではないかと思います。 プログラムは初めは敷居が高く感じるかもしれませんが、実際にふれていじっていればそのうちに結構慣れるもんだと思います。 上述したような、高機能な開発環境があれば1行ごとに動作を確認しながら実行するデバッグ実行などもできますので、この機に導入して試してみてはいかがでしょうか。 (処理のミスでファイルを喪失したりなどしないように、最初はデバッグ実行からやっていくのが本来はよいと思います)

noir96
質問者

お礼

ご回答ありがとうございました。 アドバイスありがとうございます。 コンパイル中に20行のあたり 「var targetPattern~」 でエラーが出てしまったようでうまく コンパイルすることができませんでした。 プログラムに拙いので、エラーを修正することができませんでした。 ただ、C#を使ったプログラムについては、今後スキルとして 学べたらと思いましす。 ありがとうございました。

  • chachaboxx
  • ベストアンサー率23% (412/1777)
回答No.1

選別したいファイルが毎日、数万ファイルも発生するならともかく、数百ファイルくらいなら手作業で処理してもそんなに面倒ではないかも…。 1.エクスプローラで、先頭ファイルのアンダースコア間の名称をコピー 2.新しいフォルダを作成し名称を貼り付け 3.検索BOXの名称を貼り付けて検索 4.ヒットしたファイルを全て切り取り2.で作成したフォルダに貼り付け 5.→1.に戻り、最終的にファイルがなくなるまでこの作業の繰返し WSHスクリプトや本格的なプログラムでも勿論できますが、数行で説明できる内容でもないので、割愛させて頂きます。

noir96
質問者

お礼

ありがとうございます。 数万・・・・はないのですが、対象のファイルは比較的多く、コピペミス(文字を一文字コピペしていなかった等)が発生していたので、その対策を兼ねたいと思っていました。

関連するQ&A