• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:バッチ処理でファイルを一つにまとめる)

ファイルを一つにまとめるためのバッチ処理方法

このQ&Aのポイント
  • フォルダ内にツリー状に振り分けられた数千個のファイルから、エクセルに記載された同じファイル名のファイルのみを取り出し、別のフォルダにコピーして集める方法を解説します。
  • エクセルに記載されたファイル名には重複や存在しないものがあるかもしれませんが、それらを考慮しながら効率的にファイルをまとめる手順を紹介します。
  • 外付けHDD_Aの中のmainフォルダ内にあるツリー状のフォルダから、外付けHDD_Bのmatomeフォルダにファイルを移動する方法も説明します。

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

  • ベストアンサー
  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.6

> 何かオススメのプログラミングありますでしょうか? プログラミング言語のお勧めは人によって意見が違うので (例えば、知らない言語はお勧めしようがないですし) 目的を明確にした上で別途質問を立てた方が良いかもしれないです。 適当なワードで検索してみるのも良いでしょう。 初心者 プログラミング言語 - Google 検索 https://www.google.co.jp/search?q=%E5%88%9D%E5%BF%83%E8%80%85+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E 初めて プログラミング言語 - Google 検索 https://www.google.co.jp/search?q=%E5%88%9D%E3%82%81%E3%81%A6+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E > 同じようなことができる 同じようなことを、テキストファイルの読み書きやファイル管理(移動やコピー)と考えると、 文字列の扱いが容易な言語が良さそうですね。 ファイル管理はたいていのプログラミング言語でできますが、 言語によっては日本語ファイル名を扱うときに文字コードなどに注意する必要があります。 Windowsであると言うことを考えると ・Excel VBAやVBScript ・Windows Powershell ・C# などが、日本語ファイル名でトラブルになりにくそうです。 (どれもMicrosoftが開発してるので) Windows Powershellはバッチファイルの置き換えも狙って作られた言語なので 今回のような場面ではある意味いちばんお勧めかもしれません。 (高機能なバッチファイルみたいな言語) ただ、割と最近の言語なので ネット上の情報量はあまり多くないかもしれません。 検索するといくつか入門記事はあるようですが。 Windows Powershell - Google 検索 https://www.google.co.jp/search?q=Windows+Powershell C#は一般的なWindowsアプリケーションを作れる言語です。 その意味では本格的な言語と言えるでしょうか。 他の候補としては ・Ruby があります。 文字列の扱いが得意ですし、最新版なら日本語ファイル名の扱いも特に問題なさそうです。 日本語情報も多いですし、割と入門向けな方かと。 Rubyとよく比較される言語に、PerlやPythonもありますが、 Perlは日本語ファイル名の扱いがちょっと面倒、 Pythonは日本語情報が少ない点でお勧めからは外れますね。

miyabi_700
質問者

お礼

ありがとう御座います。 紹介頂いたサイトと、Gotthold さんのオススメから VBAの勉強でもしてみようと思います。 本当に助かりました。

その他の回答 (5)

  • pc_net_sp
  • ベストアンサー率46% (468/1003)
回答No.5

http://www.geocities.co.jp/HeartLand-Apricot/4966/ekuserudefairukannri1.html この辺が参考になるでしょうか?? 注意: バックグラウンドサウンドがうるさいので、ボリュームを絞るかミュートにしてからアクセスしましょう。 HTMLの作成・製作者の感性が、私にはあいません。 (特にサウンドボリューム)     

miyabi_700
質問者

お礼

ご親切にご回答頂きありがとう御座います。 他の方に回答頂いたやり方で解決しました。 ありがとう御座いました。

  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.4

以下の記述を 拡張子bat (filecopy.batとか) のテキストファイルとして保存し 実行すれば、目的のことはできると思います。 バッチファイルの最初の方にある copy_from、copy_to、list_file、work_fileに指定しているパスは そちらの環境に合わせて書き換えてください、 また、エクセルのA列は バッチファイル内のset list_fileで指定するファイルにコピーしておきます。 ==ここから==================================== @echo off rem copy_fromにmainフォルダ、copy_toにmatomeフォルダを設定する set copy_from=D:\Temp\main set copy_to=D:\Temp\matome rem エクセルのA列をテキストファイルにコピーして rem そのテキストファイルのパスを指定する set list_file=D:\Temp\filelist.txt rem work_fileには作業用に生成されるファイル名を適当に指定 set work_file=D:\Temp\fullpathlist.txt rem 作業ファイルが存在するなら削除 del "%work_file%" rem dirでファイルを探すためコピー元フォルダに移動 pushd "%copy_from%" rem コピーするためのファイルリスト(フルパス)をwork_fileに出力 for /f "delims= usebackq" %%F in ("%list_file%") do ( dir /b /s "%%~F" >> "%work_file%" ) rem コピーを実行 for /f "delims= usebackq" %%G in ("%work_file%") do ( copy "%%~G" "%copy_to%\%%~nxG" ) rem 元のフォルダに戻る popd ==ここまで==================================== [D:\Temp\filelist.txt の内容] aaa.txt ccc.txt ggg.txt hhh.txt kkk.txt mmm.png これって、今までは手動でやってたんでしょうか。 だとしたら私の感覚だと信じられない時間の無駄遣い・・・。 何でも良いからプログラミング勉強しようよ。

miyabi_700
質問者

お礼

す、すごい!! 一日がかりの作業が一瞬で終わってしまいました。 Gotthold さんは天才ですか? 大変助かりました。 同じようなことができる 何かオススメのプログラミングありますでしょうか?

miyabi_700
質問者

補足

丁寧に、なんのコマンドが何の処理をしているかまで 書かれていますね! ご親切に説明まで書いていただきありがとう御座います。 神様だ!

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.3

解釈が合っていればいいんですが。 まず、添付図の説明です。 Sheet1のA1からコピーしたいファイル名が入力されています。 処理手順は2つあって、ファイル名の抽出とコピーの実行です。 【ファイル名の抽出】 指定フォルダーの(サブフォルダーも含めて)ファイルで拡張子が「txt、png」のファイルの、ファイル名をE列、フルパスをF列に出力します。 同時に、出力したファイル名でA列を検索し、一致すればD列に「〇」を付けました。A列のファイル名についても、「〇」と何行目に一致したかを表示します。 最初の処理は終わりです。添付図ではCommandButton1に割り当てています。 【コピーの実行】 D列の「〇」が付いたファイルについてコピーします。添付図ではCommandButton2に割り当てています。(この「〇」が付いたファイルをフルパスを求めてコピーしたいと解釈したわけです。合ってます?) 標準モジュールの2つのフォルダー名はご自分の環境に合わせてください。数個のフォルダーとファイルでテストしてください。単純なことしかしていないので、内容は見てもらえば分かるでしょう。添付図のセル位置がモジュールの内容に関連しています。とりあえず、A列へのファイル名の入力と、シート名「Sheet1」は守ってください。 質問の前提で考えました。イレギュラーに対応するエラー対応は長くなるので書いていません。ご理解ください。当方、Excel2010です。 <<Sheet1のコードウィンドウに貼り付けます>> ↓ '************************ 'ファイルを探す '************************ Private Sub CommandButton1_Click()   Set ws1 = Worksheets("Sheet1") 'ワークシートを変数にする   rw = 0             '行カウンタクリア   Range("B:F").ClearContents   '出力範囲クリア   Set TargetArea = Range("A1", Cells(Rows.Count, "A").End(xlUp))      FileSearch mainFolder  'ファイルの検索開始 End Sub '************************ 'ファイルをコピーする '************************ Private Sub CommandButton2_Click()   Dim cnt As Integer  'コピーしたファイル数      rw = 1   While Cells(rw, "E") <> ""     If Cells(rw, "D") = "○" Then       'コピー実行       FileCopy Cells(rw, "F"), destiFolder & "\" & Cells(rw, "E")       cnt = cnt + 1     End If          rw = rw + 1   Wend      MsgBox cnt & "個のファイルをコピーしました。" End Sub <<標準モジュールに貼り付けます>> ↓ Public ws1 As Worksheet    'ワークシート Public rw As Long       '行カウンタ Public TargetArea As Range   '登録されたファイル名 Public FoundCell As Range   '検索したセル '■■ 次の2つのフォルダー名は設定する Public Const destiFolder = "D:\matome"     'matomeにあたる Public Const mainFolder = "D:\FileSearchTest" 'mainにあたる '******************************************* '指定フォルダー(サブフォルダーも)調べる '******************************************* Sub FileSearch(strFolder As String)   Dim fso As Object     'ファイルシステムオブジェクト   Dim folder As Object   'フォルダー   Dim subfolder As Object 'サブフォルダー   Dim file As Object    'ファイル   Set fso = CreateObject("Scripting.FileSystemObject")   Set folder = fso.GetFolder(strFolder)   'サブフォルダーを調べる(再帰)   For Each subfolder In folder.SubFolders     FileSearch subfolder.Path   Next      '見つけたファイルを書き出す   For Each file In folder.Files     If Right(file, 4) = ".txt" Or Right(file, 4) = ".png" Then       rw = rw + 1       ws1.Cells(rw, "E") = file.Name       ws1.Cells(rw, "F") = file.Path            Set FoundCell = TargetArea.Find( _               what:=file.Name, LookIn:=xlValues)              '見つけたらシートに印を付ける       If Not (FoundCell Is Nothing) Then         ws1.Cells(rw, "D") = "○"         ws1.Cells(FoundCell.Row, "B") = "○ " & Right("  " & rw, 4)       End If     End If   Next End Sub

  • pc_net_sp
  • ベストアンサー率46% (468/1003)
回答No.2

>自分の望んでいる形としては。 >エクセルにピックアップされたファイル名のファイルのみ、コピーしたいと考えています。 エクセルにピックアップされているファイル名は、実在しないファイル名があると言う事ではないのですか?? >エクセルに記載されているファイル名には、フォルダ内には存在しないものも書かれていることもあります。 エクセルに記載されているファイル名で実在するファイルをコピーしたいと言う事ではないのですか?? エクセルに記載されているファイル名で実在するファイルの中で、特定のファイルを抜粋してコピーしたいなら、ちょっと面倒ですが、エクセルファイルをCSV出力して、コピーしたいファイルを抜粋しないといけませんね!! とりあえず、エクセルファイルをZIP圧縮してhttp://www.geocities.jp/等のダウンロードできる所に用意して下さい。 あわせて、コピーしたいファイルとそうでないファイルの説明文も一緒にZIP圧縮ファイルに入れて置いて下さい。 (コピーしたいファイルとそうでないファイルの区別の仕方に、何らかの規則性があれば言う事ないのですが・・・・) ついでにコピーしたいファイル数とそうでないファイル数も大雑把で良いので書いて下さい。 P.S. 本来これ以上のサポートは、数万円の報酬費を頂いています。 でもこのサイトでは商売できないので、必要最小限の情報提供で我慢して下さい。 後は自己責任・自己努力で、頑張って下さい。 私の説明が理解できれば、必要ファイルのコピーと不要ファイルの排除は、確実に出来ます。           

miyabi_700
質問者

お礼

>>エクセルに記載されているファイル名で実在するファイルをコピーしたいと言う事ではないのですか?? 上記のことをしたいです。 難しいでしょうか?

miyabi_700
質問者

補足

すみません、追記です エクセルに書かれていないものはコピーしない方向で お願いしたいです。

  • pc_net_sp
  • ベストアンサー率46% (468/1003)
回答No.1

確認 >外付けHDD_A の中のmainフォルダ内から(ツリー状に振り分けられている) ツリー状になった複数のフォルダ構成。 >外付けHDD_B の中のmatomeフォルダ内に移動させたいです(一箇所にあつめる) 1つのフォルダに全てのファイルを一まとめにする。 この条件でしたら、バッチファイルを使う必要もないでしょう。 コピー方法 まず、Explorerでmainフォルダを開く。 次に、ファイルとフォルダの検索をかける。 検索文字は「*.txt,*.png」。 最後に、検索後に表示されたファイルを、HDD_Bにコピーすれば、1つのフォルダにコピーされます。 検索時のファイルの種類がTXTとPNG以外に多数ある場合は検索文字を「,」カンマでくくって、「*.拡張子」で検索文字を増やして下さい。 面倒な場合は、「*.*」で検索して下さい。(検索に問題はないですが、あまりお奨めはしません。)              

miyabi_700
質問者

補足

ご回答ありがとう御座います。 上記コピー方法ですと txtファイルとpngファイルが全てコピーしてしまうことになります。 自分の望んでいる形としては。 エクセルにピックアップされたファイル名のファイルのみ コピーしたいと考えています。 自分の質問がわかりずらく、申し訳ありません。

関連するQ&A

専門家に質問してみよう