
No.5ベストアンサー
- 回答日時:
私は、「CSVを結合する単独のバッチファイル」だと思っていたのですが、「途中で別のバッチを開かせるという発想はありませんでした」という事は、「既存のバッチファイルの途中に、CSVファイルを結合する処理を書きたい」という事でしょうか。
その場合は、当該の個所に、以下の線内の処理を書き込んでみてください。
―――――――――――――――――――――――――
rem ――――――――――――――――――――
rem ■ CSV結合
rem ■ 遅延環境変数を有効にする
SETLOCAL enabledelayedexpansion
rem ■ 設定
set サブフォルダも対象とするか=n
set "対象フォルダ=C:\CSVがあるフォルダ"
set "出力ファイル=結果.csv"
rem ■ ユーザー入力による設定
echo.
set /p "開始日=開始日は?>>>"
set /p "終了日=終了日は?>>>"
rem ■ エラーの場合はこの処理の終わりへジャンプ
if not exist "%対象フォルダ%" goto END_CSV結合
if "%開始日%"=="" goto END_CSV結合
if "%終了日%"=="" goto END_CSV結合
rem ■ 掃除
if exist "%TEMP%\CSV_Temp" rd /q /s "%TEMP%\CSV_Temp"
if exist "%出力ファイル%" del /q "%出力ファイル% "
rem ■ 一時フォルダ作成
md "%TEMP%\CSV_Temp\Cache"
rem ■ サブフォルダ処理用のオプションをセット
if "%サブフォルダも対象とするか%"=="y" set "サブフォルダオプション=/s"
rem ■ 改行用ファイルの作成
echo.> "%TEMP%\CSV_Temp\br"
rem ■ 連番のセット
set "連番=1000000000"
rem ■ 対象フォルダへ移動
pushd "%対象フォルダ%"
rem ■ ループ処理開始
for /F "delims=" %%a in ('dir %サブフォルダオプション% /b /a-d *.csv') do (
rem ■ 更新日時を調べる
call :sub "%%a"
rem ■ 条件が合った場合の処理
if ERRORLEVEL 1 (
rem ■ 「今回の更新日時」をセット
for %%b in ("%%a") do set "今回の更新日時=%%~tb"
set "今回の更新日時=!今回の更新日時:/=!"
set "今回の更新日時=!今回の更新日時::=!"
set "今回の更新日時=!今回の更新日時: =0!"
rem ■ 連番を増やす
set /a "連番=!連番!+1"
rem ■ 改行を付けてファイルをキャッシュする
copy /b "%%a"+"%TEMP%\CSV_Temp\br" "%TEMP%\CSV_Temp\Cache\!今回の更新日時!_!連番!.csv"
)
)
rem ■ 前のフォルダへ戻る
popd
rem ■ キャッシュしたファイルの結合
copy /b "%TEMP%\CSV_Temp\Cache\*.csv" "%出力ファイル%"
rem ■ 掃除
rd /q /s "%TEMP%\CSV_Temp"
rem ■ 結果表示
if exist "%出力ファイル%" start "" "%出力ファイル%"
rem ■ この処理の終わりへジャンプ
goto END_CSV結合
rem ■ サブルーチン
:sub
set var=%~t1
if "%var:~0,10%" LSS "%開始日%" exit /b 0
if "%var:~0,10%" GTR "%終了日%" exit /b 0
exit /b 1
rem ■ この処理の終わり
:END_CSV結合
rem ■ 遅延環境変数の使用終了
ENDLOCAL
rem ――――――――――――――――――――
―――――――――――――――――――――――――
No.4
- 回答日時:
No.3です。
新たに、ユーザー入力、サブフォルダ、大量ファイル、ドラッグ&ドロップに対応した処理を書きましたので、一度そちらでテストしてみてください。
――――――――――――――――――――――――――
@echo off
rem ■ バッチファイルのフォルダへ移動
pushd "%~dp0"
rem ■ 一時フォルダの掃除と作成
if exist "%TEMP%\CSV_Temp" rd /q /s "%TEMP%\CSV_Temp"
md "%TEMP%\CSV_Temp\Cache"
rem ■ ユーザー入力による設定
echo.
set /p "開始日=開始日は?>>>"
set /p "終了日=終了日は?>>>"
rem ■ 既定の設定
set サブフォルダも対象とするか=n
set "対象フォルダ=C:\CSVがあるフォルダ"
set "出力ファイル=結果.csv"
rem ■ フォルダがD&Dされていたらそこを対象フォルダとする
if "%~1"=="" goto END_SetDir
if exist "%~1\" set "対象フォルダ=%~1"
:END_SetDir
rem ■ エラーによる終了
if not exist "%対象フォルダ%" exit /b
if "%開始日%"=="" exit /b
if "%終了日%"=="" exit /b
rem ■ 掃除
if exist "%出力ファイル%" del /q "%出力ファイル% "
rem ■ サブフォルダ処理用のオプションをセット
if "%サブフォルダも対象とするか%"=="y" set "サブフォルダオプション=/s"
rem ■ 改行用ファイルの作成
echo.> "%TEMP%\CSV_Temp\br"
rem ■ 連番のセット
set "連番=1000000000"
rem ■ 対象フォルダへ移動
pushd "%対象フォルダ%"
rem ■ 遅延環境変数を有効にする
SETLOCAL enabledelayedexpansion
rem ■ ループ処理開始
for /F "delims=" %%a in ('dir %サブフォルダオプション% /b /a-d *.csv') do (
rem ■ 更新日時を調べる
call :sub "%%a"
rem ■ 条件が合った場合の処理
if ERRORLEVEL 1 (
rem ■ 「今回の更新日時」をセット
for %%b in ("%%a") do set "今回の更新日時=%%~tb"
set "今回の更新日時=!今回の更新日時:/=!"
set "今回の更新日時=!今回の更新日時::=!"
set "今回の更新日時=!今回の更新日時: =0!"
rem ■ 連番を増やす
set /a "連番=!連番!+1"
rem ■ 改行を付けてファイルをキャッシュする
copy /b "%%a"+"%TEMP%\CSV_Temp\br" "%TEMP%\CSV_Temp\Cache\!今回の更新日時!_!連番!.csv"
)
)
rem ■ 遅延環境変数の使用終了
ENDLOCAL
rem ■ 前のフォルダへ戻る
popd
rem ■ キャッシュしたファイルの結合
copy /b "%TEMP%\CSV_Temp\Cache\*.csv" "%出力ファイル%"
rem ■ 結果表示
start "" "%出力ファイル%"
rem ■ 掃除
rd /q /s "%TEMP%\CSV_Temp"
rem ■ 前のフォルダへ戻る
popd
rem ■ 終了
exit /b
rem ■ サブルーチン
:sub
set var=%~t1
if "%var:~0,10%" LSS "%開始日%" exit /b 0
if "%var:~0,10%" GTR "%終了日%" exit /b 0
exit /b 1
――――――――――――――――――――――――――
又、設定ファイルを使ったユーザー入力方法もあります。
バッチファイル内の「ユーザー入力による設定」と「既定の設定」の部分を消して、以下の線内の文章をそこへコピー&ペーストしてみてください。
――――――――――――――――――――――――――
rem ■ ユーザー入力による設定
if not exist "設定.txt" exit /b
notepad "設定.txt"
rem ■ 設定をセット
findstr "^set " "%~dp0設定.txt"> "%TEMP%\設定.bat"
call "%TEMP%\設定.bat"
――――――――――――――――――――――――――
そして、バッチファイルと同じ場所に、「設定」という名前のテキストファイル(設定.txt)を作成し、そこに以下の線内の文章をコピー&ペーストしてください。
――――――――――――――――――――――――――
■ 設定 ■
set 開始日=2018/02/17
set 終了日=2018/02/17
(※半角文字。「xxxx/xx/xx」形式。)
set サブフォルダも対象とするか=n
(※「はい」=「y」。「いいえ」=「n」。半角文字。)
set "対象フォルダ=C:\CSVがあるフォルダ"
(※前後の「"」は必須です。パスの末尾に「\」は付けないでください。フォルダがD&Dされた場合はそちらが優先されます。)
set "出力ファイル=結果.csv"
(※前後の「"」は必須です。バッチファイルからの相対パスか、絶対パスを書き込みます。)
――――――――――――――――――――――――――
バッチファイル起動時に、上記の設定ファイルが開きますので、そこに日時を打ち込み、上書き保存して閉じると、処理が続行される仕組みです。
この方法の長所は、履歴を残せるので、打ち込む文字数を減らせる所や、慣れた操作性で書き込める出来る点です。
「set 」で始まる行以外はコメント行ですので、削除しても構いません。
又、日時以外の設定が邪魔なら、改行を多くとって、下の方に追いやって頂いても構いません。
VBSや、WSHや、PowerShell等を使えば、綺麗な入力ダイアログを出せたりすると思いますが、私にはそのスキルが無いので、必要なら調べてみてください。
バッチの途中になんとか入力できないかと考えていましたが、途中で別のバッチを開かせるという発想はありませんでした。。、ありがとうございました。
No.3
- 回答日時:
No.2さんのサブルーチンをお借りすると、以下のような感じのバッチファイルで出来るかと思います。
設定部分だけ書き換えてください。サブフォルダは対象としません。
―――――――――――――――――――――――――
@echo off
rem ■ 設定
set "日時ここから=2017/04/05"
set "日時ここまで=2018/01/05"
set "対象フォルダ=C:\CSVがあるフォルダ"
rem ■ 対象フォルダに移動
pushd "%対象フォルダ%"
rem ■ 改行用ファイルの作成
echo.> "temp"
rem ■ 遅延環境変数を有効にする
SETLOCAL enabledelayedexpansion
rem ■ 指定日時に合ったファイル名だけを変数「ファイルリスト」に代入
for /F "delims=" %%a in ('dir /b /a-d *.csv') do (
call :sub "%%a"
if ERRORLEVEL 1 set ファイルリスト=!ファイルリスト!+"%%a"+temp
)
rem ■ ファイル結合
copy /b nul%ファイルリスト% "%~dp0結果.csv"
rem ■ 結果表示
start "" "%~dp0結果.csv"
rem ■ 遅延環境変数を無効にする
ENDLOCAL
rem ■ 掃除
del /q "temp"
rem ■ 元のフォルダに戻る
popd
rem ■ 終了
exit /b
rem ■ サブルーチン
:sub
set var=%~t1
if "%var:~0,10%" LSS "%日時ここから%" exit /b 0
if "%var:~0,10%" GTR "%日時ここまで%" exit /b 0
exit /b 1
―――――――――――――――――――――――――
No.2
- 回答日時:
ファイル名を渡して希望の範囲か確かめるサブルーチン。
こんな感じですかね。呼んだ後で if ERRORLEVEL 1 ...
:sub
set var=%~t1
if "%var:~0,10%" LSS "2017/04/05" exit /b 0
if "%var:~0,10%" GTR "2018/01/05" exit /b 0
exit /b 1
No.1
- 回答日時:
言語によってはできるものもあるかもしれませんが、基本的にはファイル情報を取得、更新日時を比較、抽出対象として確保、という流れをファイル数分行うのがスタンダードでしょうね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) CSVファイルの「0落ち」にVBA 6 2023/02/02 15:27
- Excel(エクセル) Excel VBAでフォルダが何層にもなっていて最下層の中にCSVファイルがあり最上層のファイルを指 4 2022/06/08 20:41
- Visual Basic(VBA) VBAで特定の場所にあるCSVファイル(複数)から特定場所を抜き出してExcelに転記したいです。 11 2023/05/23 16:29
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- その他(プログラミング・Web制作) データ解析ソフトRでのファイル入力read.csvがエラーになります 7 2022/03/27 22:11
- その他(プログラミング・Web制作) pythonのpandasのcsvの外部結合(outer_join)した際に列が想定とは異なる事象 1 2022/05/25 13:23
- HTML・CSS HTMLタグのあるCSVファイルを利用する方法 4 2023/03/19 14:41
- Excel(エクセル) 【マクロ】webアドレスにて指定されたCSVファイル【excelソフト表示】を印刷する件 1 2023/02/15 01:52
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コマンドプロンプトの「%1」と...
-
コマンドプロンプトでファイル...
-
コマンドプロンプトで変数が数...
-
ftp処理でmove(移動)を行いたい
-
[DOS] コピー先に同じファイル...
-
フォルダ内の更新日時が一番新...
-
ファイル名に ” を使うと エク...
-
サブフォルダからファイルをコ...
-
VBScriptの活用について
-
バッチファイルで、iniファイル...
-
バッチコマンドでファイル名の...
-
ExcelVBAのDirでスペース含むフ...
-
アクロバットのDistillerのファ...
-
任意のファイル名の変更
-
VBScriptで特別な意味を持つ記...
-
Excel VBA マクロ ファイル名ソ...
-
バッチにて複数のcsvファイルを...
-
エクセルVBAを使用してJPGファ...
-
スタートアップのファイルをバ...
-
【DOSバッチ開発】末尾のタブの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンドプロンプトの「%1」と...
-
バッチファイルで、iniファイル...
-
コマンドプロンプトでファイル...
-
ftp処理でmove(移動)を行いたい
-
コマンドプロンプトで変数が数...
-
ExcelVBAのDirでスペース含むフ...
-
[DOS] コピー先に同じファイル...
-
ファイル名の頭5桁と同名のフォ...
-
サブフォルダからファイルをコ...
-
フォルダ内の更新日時が一番新...
-
.batでファイル名から抽出して...
-
access,vbaでフォルダ内のファ...
-
バッチファイルで同一フォルダ...
-
バッチコマンドでファイル名の...
-
Windowsコマンドプロンプトで、...
-
スタートアップのファイルをバ...
-
ファイル名に ” を使うと エク...
-
ファイル名を該当フォルダ内か...
-
aタグのhrefにネットワークパス...
-
【DOSバッチ開発】末尾のタブの...
おすすめ情報
申し訳ないです。
あらかじめ指定した日付だとできるのですが、日付を自分で指定したいと考えています。
開始日は?>>>
終了日は?>>>
と聞かれて、日付を入力するとその日付をとってくるようにしたいのですが、変数を使用して処理を行ってもうまくいきません。。
どのようにすればよろしいでしょうか。