本記事では バッチファイル から Cygwin の bash を実行し
東京都_新型コロナウイルス陽性患者発表詳細 に関連した 4つのCSVファイル を結合する方法を紹介します。
目次
はじめに
2022/03/18 以降、当サイトでその作成方法を紹介している 東京都 新型コロナウイルス陽性患者発表詳細のグラフ
が更新されなくなったため、念のため「東京都_新型コロナウイルス陽性患者発表詳細」を確認したところ、
※「全期間一括データ」はファイルサイズの制限により2022年3月18日以降更新を停止しています。申し訳ありませんが、「年別分割データ」をご利用ください。
との記載があり、今まで通年で更新されていた「東京都_新型コロナウイルス陽性患者発表詳細」の CSV ファイルが年度毎、さらに年度内で複数に分割されることがわかりました。
つまり、今まで
- 130001_tokyo_covid19_patients.csv
という1つのCSV ファイルを対象に行っていた処理を 2022/03/18 以降は
- 130001_tokyo_covid19_patients_2021.csv
- 130001_tokyo_covid19_patients_2022.csv
- 130001_tokyo_covid19_patients_2022-1.csv
- 130001_tokyo_covid19_patients_2022-2.csv
という4つの CSV ファイルを対象に行わなければならなくなってしまった訳です。
この CSV のダウンロード自体は
でもご紹介しているように しらかば堂の 関数ライブラリ DownloadCsvFromUrl
を使うことで簡単に %UserProfile%\Downloads 配下にダウンロードできるため、これをを単純に複数回繰り返せば良さそうなのですが、これをどうやって結合し、元のCSVファイルと同じ名前にしたらいいでしょうか。
それがこの記事のテーマになります。
この記事の投稿後 Twitterで @ac4tweet さんから別のやり方を教えて頂いたので合わせて末尾でご紹介しておきます。
バッチファイルから Cygwin の bash を実行し 2つのCSVファイルを結合する
それではその方法をご紹介します。
以降の記載は Windows 10 PCに Cygwin(注1) がインストールされていることを前提としていますので、インストールがまだの方は以下の記事等を参考にまず Cygwin をインストールしましょう。
(注1) Cygwin は Windows環境下で UNIX/Linux 風のコマンド、環境を利用可能とするためにWindows 上にUNIX互換OSをエミュレートするためのライブラリ「cygwin1.dll」や Windows 環境下でコンパイルされたツール群を配置することで bash、sed、grep、awkといった通常 UNIX/Linux で利用可能な便利なツールを Windows 環境下の下記ターミナル画面からも利用可能にしています。
Cygwin のインストール方法、基本的なコマンド、そして標準入出力・リダイレクション・パイプといった UNIX/Linux 環境下でコマンドをより便利に使うための重要な考え方については以下のような素晴らしい記事が公開されていますので必要に応じてこれらの記事を参照頂ください。
Cygwin の bash を実行するバッチファイルの作成
まず Cygwin の bash を実行するバッチファイルとして次のバッチファイル
- 結合_130001_tokyo_covid19_patients_csv.bat
を作成し
- %USERPROFILE%\Tools\bat
配下に保存します。
@echo off
\cygwin64\bin\bash --login -i -c "cat '%USERPROFILE%\Downloads\%1' '%USERPROFILE%\Downloads\%2' '%USERPROFILE%\Downloads\%3' '%USERPROFILE%\Downloads\%4' > '%USERPROFILE%\Downloads\130001_tokyo_covid19_patients.csv'"
このファイルをツール本体のバッチファイル
- 作成_東京都コロナウイルス_発症者推移グラフ.bat
の中で、4つの CSV ファイルのダウンロード後に呼び出せば
- 130001_tokyo_covid19_patients_2021.csv
- 130001_tokyo_covid19_patients_2022.csv
- 130001_tokyo_covid19_patients_2022-1.csv
- 130001_tokyo_covid19_patients_2022-2.csv
という4つの CSV ファイルを
- 130001_tokyo_covid19_patients.csv
Cygwin の bash を実行するバッチファイルの詳細
それでは先ほど紹介した
- 結合_130001_tokyo_covid19_patients_csv.bat
の内容について詳細に説明します。
まず
@echo off
は、このコマンド以降以降の出力を抑制するWindows のコマンドです。@ はこのコマンド自身も出力しないことを指定しています。
bash の実行方法
バッチファイルから Cygwin の bash を実行するときは次のように記述します。
\cygwin64\bin\bash –login -i -c “bash に渡すコマンド文字列” |
この \cygwin64\bin は Cygwin がインストールされているフォルダのフルパス名で、このフォルダをコマンドプロンプト画面で確認すると Cygwin が提供するコマンド群が保存されています。
このフォルダ配下では “ls *.exe” という UNIX/Linux 互換コマンド ( Windows のコマンドプロンプトの “dir *.exe” 相当 )も実行できます。
つまり Windows の環境変数 %PATH% に C:\cygwin64\bin を追加すれば通常のコマンドプロンプトからも UNIX/Linux 互換コマンド が使えます。
そして bash 実行時のオプションは
- -login は Cygwin へログインすること
- -i は bash をインタラクティブモード、つまり後続のコマンド文字列が端末から入力されたかのようにbash を動かすこと
- -c の次にくる2つのダブルクオーテーション ” ” で囲んだ文字列を bash に渡すコマンド文字列とすること
を指定しています。
つまりここで
cat ‘%USERPROFILE%\Downloads\%1’ ‘%USERPROFILE%\Downloads\%2’ ‘%USERPROFILE%\Downloads\%3’ ‘%USERPROFILE%\Downloads\%4’ > ‘%USERPROFILE%\Downloads\130001_tokyo_covid19_patients.csv’ |
という文字列をコマンドとして bash に渡していますが、この文字列が Cygwin 起動後の bash により UNIX/Linux 互換コマンドとして実行される訳です。
このコマンド列にユーザーが自分で定義した UNIX/Linux 互換の シェルスクリプト を記述すれば Windows のバッチファイルから Unix/Linux 互換のシェルスクリプトを実行することもできます。
cat コマンド
この cat コマンドは UNIX/Linux 互換のコマンドの中で最も基本的なコマンドです。
例えば
cat ファイル1 ファイル2 ファイル3 ファイル4 |
は ファイル1、ファイル2、ファイル3、ファイル4 を連続して標準出力に出力します。
また
cat ファイル1 ファイル2 ファイル3 ファイル4 > ファイル5 |
は、リダイレクション用のオペレータ ‘>‘ を使うことでこの標準出力に連続出力した ファイル1、 ファイル2、ファイル3、 ファイル4 をさらにファイル5に保存します。
Windows のフルパス名と変数の Cygwin への渡し方
ところでこの例ではファイル1、ファイル2、ファイル3、ファイル4、ファイル5に相当する部分が 2つのシングルクオーテーション ‘ ‘ で囲んだ
- ‘%USERPROFILE%\Downloads\%1’
- ‘%USERPROFILE%\Downloads\%2’
- ‘%USERPROFILE%\Downloads\%3’
- ‘%USERPROFILE%\Downloads\%4’
- ‘%USERPROFILE%\Downloads\130001_tokyo_covid19_patients.csv’
となっています。
実は 2つのシングルクオーテーション ‘ ‘ で囲むと Windows のフルパス名をそのまま Cygwin に渡すことができます。
Windows 10 の WSL2 有効化後にインストールされた Ubuntsu 等の Distributed Linux 内ではこのようなことはできません。
個人的な意見ですが、このことから バッチファイルから利用可能な UNIX/Linux 環境の選択肢 としては Cygwin に歩があるように思います。
また bash ヘ渡される2つの ダブルクオーテーション ” ” で囲まれた文字列中にある Windows の変数 や 環境変数 は bash に文字列を引き渡す直前に Windows 環境の中で先に評価されます。
従ってこの仕組みを利用することで、 Windows 側の 変数や環境変数の評価値をそのまま bash へ引き渡すこともできる訳です。
本当に便利だと思いませんか?
ちなみに %USERPROFILE% はこのPCのログインユーザーのデフォルトフォルダなので %USERPROFILE%\Downloads はログインユーザーのダウンロードフォルダを指定しています。
また、%1、%2、 %3、%4 はこのバッチファイル
- 結合_130001_tokyo_covid19_patients_csv.bat
の呼び出し時の 第1パラメータ、第2パラメータ 、第3パラメータ、第4パラメータです。この具体的な設定値については後ほど紹介します。
先ほどの @echo off やこれらの変数、環境変数等に関連した一般的なバッチファイルの書き方については必要に応じて
も参考にしてください。
ツールの修正内容
作成_東京都コロナウイルス_発症者推移グラフ.bat の修正
以上をふまえ
で紹介した東京都コロナウイルスに関連した3つのグラフを描画するバッチファイル
- 作成_東京都コロナウイルス_発症者推移グラフ.bat
の修正後の全体像を紹介します。
@echo off
setlocal
rem スリープタイマ値を設定する
set wait_time=2
echo 01.%USERPROFILE%\Downloadsに移動
timeout /t %wait_time% > nul
cd %USERPROFILE%\Downloads
if exist 130001_tokyo_covid19_patients.csv (
echo 02.旧 130001_tokyo_covid19_patients.csv ファイルを削除
timeout /t %wait_time% > nul
del 130001_tokyo_covid19_patients*.*
del /Q %USERPROFILE%\Tools_Data_Temp\xlsx\*.*
)
echo 03.新 130001_tokyo_covid19_patients.csv ファイルをダウンロード
timeout /t %wait_time% > nul
cd %USERPROFILE%\Tools\accdb
入手_130001_tokyo_covid19_patients_csv.accdb
cd %USERPROFILE%\Tools\bat
call 結合_130001_tokyo_covid19_patients_csv 130001_tokyo_covid19_patients_2021.csv 130001_tokyo_covid19_patients_2022.csv 130001_tokyo_covid19_patients_2022-1.csv 130001_tokyo_covid19_patients_2022-2.csv
echo 04.%USERPROFILE%\Tools\accdbに移動
timeout /t %wait_time% > nul
cd %USERPROFILE%\Tools\accdb
echo 05.130001_tokyo_covid19_patients.csv から T0000_東京都コロナ発症状況_マスタ を作成
timeout /t %wait_time% > nul
作成_T0000_東京都コロナ発症状況_マスタ.accdb
echo 06.T0000_東京都コロナ発症状況_マスタ から T1040_日付_退院者数_入院者数_退院率.xlsx を作成
timeout /t %wait_time% > nul
作成_T1040_日付_退院者数_入院者数_退院率_xlsx.accdb
echo 07.T0000_東京都コロナ発症状況_マスタ から T2040_日付_女性入院者数_男性入院者数.xlsx を作成
timeout /t %wait_time% > nul
作成_T2040_日付_女性入院者数_男性入院者数_xlsx.accdb
echo 08.T0000_東京都コロナ発症状況_マスタ から T3200_日付_年代別入院者数.xlsx を作成
timeout /t %wait_time% > nul
作成_T3200_日付_年代別入院者数_xlsx.accdb
echo 09.3つのグラフ描画用データをそれぞれのグラフ描画用テンプレートにコピー
timeout /t %wait_time% > nul
copy %USERPROFILE%\Tools_Data_Static\xlsx\*_グラフ.xlsx %USERPROFILE%\Tools_Data_Temp\xlsx
更新_東京都コロナ感染者分析グラフ_xlsx.accdb
echo 10.T1040_日付_退院者数_入院者数_退院率_グラフ.xlsx を起動
timeout /t %wait_time% > nul
%USERPROFILE%\Tools_Data_Temp\xlsx\T1040_日付_退院者数_入院者数_退院率_グラフ.xlsx
echo 11.T2040_日付_女性入院者数_男性入院者数_グラフ.xlsx を起動
timeout /t %wait_time% > nul
%USERPROFILE%\Tools_Data_Temp\xlsx\T2040_日付_女性入院者数_男性入院者数_グラフ.xlsx
echo 12.T3200_日付_年代別入院者数_グラフ.xlsx を起動
timeout /t %wait_time% > nul
%USERPROFILE%\Tools_Data_Temp\xlsx\T3200_日付_年代別入院者数_グラフ.xlsx
endlocal
pause
explorer /e ./root,%USERPROFILE%\Tools_Data_Temp\xlsx
この中の 25-26行 つまり
cd %USERPROFILE%\Tools\bat
call 結合_130001_tokyo_covid19_patients_csv 130001_tokyo_covid19_patients_2021.csv 130001_tokyo_covid19_patients_2022.csv 130001_tokyo_covid19_patients_2022-1.csv 130001_tokyo_covid19_patients_2022-2.csv
が今回追加した部分です。
ここでは先ほど紹介した
結合_130001_tokyo_covid19_patients_csv.bat
を 130001_tokyo_covid19_patients_2021.csv を第1パラメータ、130001_tokyo_covid19_patients_2022.csv を第2パラメータ、130001_tokyo_covid19_patients_2022-1.csv を第3パラメータ、130001_tokyo_covid19_patients_2022-2.csv を第4パラメータとして call ( 同期 処理、つまり呼び出したバッチファイルの終了を待ってから次のコマンドを実行するような処理方式で呼び出し) している訳です。
入手_130001_tokyo_covid19_patients_csv.accdb の修正
続いて 23行目 の
入手_130001_tokyo_covid19_patients_csv.accdb
への修正部分です。
まず修正前の autoexec マクロ内では
- https://stopcovid19.metro.tokyo.lg.jp/data/130001_tokyo_covid19_patients.csv
を入力パラメータとして DownloadCsvFromUrl 関数が一度だけ実行されています。
続いて修正後の autoexec マクロ内では
- https://www.opendata.metro.tokyo.lg.jp/fukushihoken/130001_tokyo_covid19_patients_2020.csv
- https://www.opendata.metro.tokyo.lg.jp/fukushihoken/130001_tokyo_covid19_patients_2021.csv
- https://www.opendata.metro.tokyo.lg.jp/fukushihoken/130001_tokyo_covid19_patients_2022-1.csv
- https://www.opendata.metro.tokyo.lg.jp/fukushihoken/130001_tokyo_covid19_patients_2022-2.csv
を入力パラメータとして DownloadCsvFromUrl 関数を 4回実行しています。
つまりたったこれだけの変更で
東京都の
※「全期間一括データ」はファイルサイズの制限により2022年3月18日以降更新を停止しています。申し訳ありませんが、「年別分割データ」をご利用ください。
という方針変更に対応できた訳です。
まとめ
いかがですか?
今回は バッチファイル から Cygwin の bash を実行し 4つのCSVファイル を結合する方法を紹介しました。
この Cygwin 環境を使用すると Windows 環境下で bash、sed、grep、awk といった通常 UNIX/Linux でしか利用できない便利なツールを 標準入出力・リダイレクション・パイプ といった重要な考え方と共に利用することができます。
興味のある方は Windows 10 搭載 PCへの導入の検討されてはいかがでしょうか。
次の記事からはいよいよ Access のテーブル間リレーションを使ったクエリ操作を行い、
を描画するための元データを作成する
作成_T2040_日付_女性入院者数_男性入院者数_xlsx.accdb
の作成方法 について具体的に紹介します。
さてこの記事全体の目標は
- 今の状況から抜け出してもっと前向きな仕事に取り組みたい
- さっさと仕事を切り上げて充実したアフターファイブを過ごしたい
でしたよね。
あなたの解決したい問題は何ですか?
次回はまた
で Access VBA の新しい窓を開きましょう。
この記事の投稿後 Twitterで @ac4tweet さんから別のやり方を教えて頂きました。cmd の COPY コマンドで ‘+’ というオペレータを使うことでファイルの連結ができるんですね。ありがとうございました。
バッチファイルから Cygwin の bash 呼び出すなら cmd の内部コマンド COPY でよくないですか?🤔@echo off
COPY /Y “%USERPROFILE%\Downloads\%~1″ +”%USERPROFILE%\Downloads\%~2” “%USERPROFILE%\Downloads\130001_tokyo_covid19_patients.csv”— ac (@ac4tweet) April 7, 2022
Microsoft Access 関連教材は次のリンクからどうぞ。
いつも記事を読んで頂きありがとうございます~
今日の調子はいかがですか?