- ベストアンサー
バッチファイル作成で過去の日付のCSVファイルを結合してFTPする方法
- バッチファイル作成で過去の日付のフォルダー内のCSVファイルを結合してFTPする方法について質問です。Logsフォルダー内には2年分のフォルダーがあり、それぞれに300件以上のCSVファイルが含まれています。今回は過去の日付のフォルダー内のCSVファイルを結合した2005050.CSVを作成し、FTPしたいと考えています。
- 今回の課題は、Logsフォルダー内の過去の日付のフォルダー内にある300件以上のCSVファイルを結合して2005050.CSVという名前で保存し、FTPする方法です。バッチファイルでの解決を試みていますが、まだうまくいっていません。具体的なバッチファイルのコードや結合方法、FTP設定についてのアドバイスをいただけると幸いです。
- バッチファイル作成で過去の日付のフォルダー内にある300件以上のCSVファイルを結合して2005050.CSVという名前で保存し、FTPする方法について質問です。Logsフォルダー内には2年分のフォルダーがあり、その中には約730個の日付付きフォルダーとそれぞれ300件以上のCSVファイルがあります。バッチファイルのコードを作成し、結合とFTPを実現したいのですが、うまくいきません。具体的な解決策を教えていただけると助かります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
CDと一時ファイルを全く使わない別解です。 あと忘れてたのですが、最初にsetlocalを書いたなら、最後には endlocal を入れた方がいいですね。 @echo off setlocal set TARGET_DIR=D:\Program Files\csv set OUT_DIR=D:\Program Files\CSVOUT DEL /Q "%OUT_DIR%\*" FOR /F %%I IN ('dir /ON /B "%TARGET_DIR%"') DO ( FOR /F %%P IN ('dir /ON /B "%TARGET_DIR%\%%I"') DO ( TYPE "%TARGET_DIR%\%%I\%%P" >> "%OUT_DIR%\%%I.CSV" ) ) endlocal
その他の回答 (2)
- agricap
- ベストアンサー率40% (79/195)
〔質問1〕 各日付ディレクトリの下にあるファイルの一覧をすべて type で 出力したいのですが、それを一気にやるのがむずかしいので、 CDでカレントディレクトリを移して、 各日付ディレクトリごとにファイルの一覧を一時的に出力して その結果に対して内側のFOR文の実行しています。 ちょっと工夫すれば、CDもこの一時ファイルも不要になるかも しれません。あたり前ですがいろいろなやり方が考えられます。 ここは、もともとの質問文の dirlist.dat のやり方に習いました。 〔質問2〕 少々やっかいですが、以下のようにしてみてください。 理屈はあまりうまく説明できません。やってみたら、できた、という レベルです。 @echo off setlocal set TARGET_DIR=D:\Program Files\csv set OUT_DIR=D:\Program Files\CSVOUT DEL /Q "%OUT_DIR%\*" cd /d "%TARGET_DIR%" dir /ON /B > "%OUT_DIR%\dirlist.dat" FOR /F %%I IN ('type "%OUT_DIR%\dirlist.dat"') DO ( CD "%TARGET_DIR%\%%I" DIR /ON /B > "%OUT_DIR%\dirlist2.dat" FOR /F %%P IN ('type "%OUT_DIR%\dirlist2.dat"') DO ( TYPE %%P >> "%OUT_DIR%\%%I.CSV" ) )
お礼
・早速有難うございます・ ""の使い方分かりました。私はset OUT_DIRの方ばかりやっていたのでOUTだった様です。 又〔質問1〕の説明有難うございました。「各日付ディレクトリごとにファイルの一覧を一時的に出力して」の説明で変数の役目が分かりました。 本当に有難うございました。
- agricap
- ベストアンサー率40% (79/195)
ポイントはFOR文の入れ子です。 入力ディレクトリと出力ディレクトリは別の場所にした方がわかりやすいですね。 @echo off setlocal set TARGET_DIR=E:\temp\csv set OUT_DIR=E:\temp\CSVOUT DEL /Q %OUT_DIR%\* cd /d %TARGET_DIR% dir /ON /B > %OUT_DIR%\dirlist.dat FOR /F %%I IN (%OUT_DIR%\dirlist.dat) DO ( CD %TARGET_DIR%\%%I DIR /ON /B > %OUT_DIR%\dirlist2.dat FOR /F %%P IN (%OUT_DIR%\dirlist2.dat) DO ( TYPE %%P >> %OUT_DIR%\%%I.CSV ) )
補足
・早速の回答有難うございました。物の見事に問題解決!!。見事に解決出来本当に有難うございました。 解決できて質問もおかしいのですが、難しくて理解できない点が有るのでもし宜しかったら教えてください。 〔質問1〕 FOR /F %%I IN (%OUT_DIR%\dirlist.dat) DO ( CD %TARGET_DIR%\%%I DIR /ON /B > %OUT_DIR%\dirlist2.dat FOR /F %%P IN (%OUT_DIR%\dirlist2.dat) DO ( TYPE %%P >> %OUT_DIR%\%%I.CSV の入れ子の部分特に「CD %TARGET_DIR%\%%I 」\%%Iと「%OUT_DIR%\dirlist2.dat」の\dirlist2.dat が必要な訳とどんな役目をしているかです。結果から見るとYYMMDDのCSVを作る為に必要と思っていますが何分初心者の為ロジックが見えません。 〔質問2〕 ・set OUT_DIR=E:\temp\CSVOUT の点ですがターデットDirが 質問では「D:\data\CL_Logs\Logs」ですが実際は 「D:\Program Files\CL Log\Logs」なので出力Dirを 「D:\Program Files\CL Log\csvout」にして見たところ「DEL /Q D:\Program Files\Fuji Xerox\csvout\*」で「指定されたファイルが見つかりません。」とエラーになり次の行で「dir /ON /B Files\」となり「D:\Program Files」が見えなくてエラーになります。""とかで囲って見ましたが旨くいきません。 しかし、ターゲットの方は「D:\Program Files\CL Log\Logs」でも問題ないようです。 出力ディレクトリを「D:\CSVOUT」にすれば問題ないことですが気になります。 ・本当に厚かましいですが宜しくお願いします。
お礼
・別解有難うございます。こちらはFor文の中で「('dir /ON /B "%TARGET_DIR%"')」等コマンドが分かりますので私的にはこちらの方が分かり易いです。 でも、今後も踏まえ今までに教えて頂いたことがしっかり理解できるようきちんと勉強して行きたいと思っています。その過程で又、分からない事が有ると質問でご面倒お掛けすると思いますが宜しくお願い致します。