プロが教えるわが家の防犯対策術!

a.csv, b.csv, c.csv, ......
という複数のcsvファイルがあったとします。
その場合に、最終更新日時にて範囲を指定することは可能でしょうか。

まとめると、
更新日時が2017/04/05~2018/01/05の間のファイルだけ抽出して結合させたいです。

宜しくお願いします。

質問者からの補足コメント

  • 申し訳ないです。

    あらかじめ指定した日付だとできるのですが、日付を自分で指定したいと考えています。

    開始日は?>>>
    終了日は?>>>

    と聞かれて、日付を入力するとその日付をとってくるようにしたいのですが、変数を使用して処理を行ってもうまくいきません。。

    どのようにすればよろしいでしょうか。

      補足日時:2018/02/19 08:10

A 回答 (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 ――――――――――――――――――――


―――――――――――――――――――――――――
    • good
    • 0

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等を使えば、綺麗な入力ダイアログを出せたりすると思いますが、私にはそのスキルが無いので、必要なら調べてみてください。
    • good
    • 0
この回答へのお礼

バッチの途中になんとか入力できないかと考えていましたが、途中で別のバッチを開かせるという発想はありませんでした。。、ありがとうございました。

お礼日時:2018/02/23 16:15

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

―――――――――――――――――――――――――
    • good
    • 0

ファイル名を渡して希望の範囲か確かめるサブルーチン。


こんな感じですかね。呼んだ後で 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
    • good
    • 2

言語によってはできるものもあるかもしれませんが、基本的にはファイル情報を取得、更新日時を比較、抽出対象として確保、という流れをファイル数分行うのがスタンダードでしょうね。

    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!