【連載】#33 バッチファイルから Cygwin の bash を実行し 4つのCSVファイルを結合する

【連載】#33 バッチファイルから Cygwin の bash を実行し 4つのCSVファイルを結合する
【連載】#32 Access VBA を使った Excel ブック間コピー処理をリファクタリングする

本記事では バッチファイル から Cygwinbash を実行し
東京都_新型コロナウイルス陽性患者発表詳細 に関連した 4つのCSVファイル を結合する方法を紹介します。

【連載】#33 バッチファイルから Cygwin の bash を実行し 4つのCSVファイルを結合する
しらかば堂

いつも記事を読んで頂きありがとうございます~
今日の調子はいかがですか?

はじめに

2022/03/18 以降、当サイトでその作成方法を紹介している 東京都 新型コロナウイルス陽性患者発表詳細のグラフ

【特集】Accessのマクロや各種クエリを使いビッグデータをクレンジング、可視化しよう【東京都_新型コロナウイルス陽性患者発表詳細の CSV ビッグデータをAccessでクレンジング、可視化する】

が更新されなくなったため、念のため「東京都_新型コロナウイルス陽性患者発表詳細」を確認したところ、

※「全期間一括データ」はファイルサイズの制限により2022年3月18日以降更新を停止しています。申し訳ありませんが、「年別分割データ」をご利用ください。

との記載があり、今まで通年で更新されていた「東京都_新型コロナウイルス陽性患者発表詳細」の CSV ファイルが年度毎、さらに年度内で複数に分割されることがわかりました。

【連載】#33 バッチファイルから Cygwin の bash を実行し 4つの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 のダウンロード自体は

【連載】#27 Access VBA の関数ライブラリを使いネットワークからCSVファイルをダウンロードしよう

でもご紹介しているように しらかば堂の 関数ライブラリ DownloadCsvFromUrl

【Access VBA】URL で指定された CSV ファイルをダウンロードする

を使うことで簡単に %UserProfile%\Downloads 配下にダウンロードできるため、これをを単純に複数回繰り返せば良さそうなのですが、これをどうやって結合し、元のCSVファイルと同じ名前にしたらいいでしょうか。

それがこの記事のテーマになります。

【連載】#33 バッチファイルから Cygwin の bash を実行し 4つのCSVファイルを結合する
しらかば堂

この記事の投稿後 Twitterで @ac4tweet さんから別のやり方を教えて頂いたので合わせて末尾でご紹介しておきます。

バッチファイルから Cygwin の bash を実行し 2つのCSVファイルを結合する

それではその方法をご紹介します。

以降の記載は Windows 10 PCに Cygwin(注1) がインストールされていることを前提としていますので、インストールがまだの方は以下の記事等を参考にまず Cygwin をインストールしましょう。

(注1) CygwinWindows環境下で UNIX/Linux 風のコマンド、環境を利用可能とするためにWindows 上にUNIX互換OSをエミュレートするためのライブラリ「cygwin1.dll」や Windows 環境下でコンパイルされたツール群を配置することで bashsedgrepawkといった通常 UNIX/Linux で利用可能な便利なツールを Windows 環境下の下記ターミナル画面からも利用可能にしています。

Cygwin のインストール方法、基本的なコマンド、そして標準入出力・リダイレクション・パイプといった UNIX/Linux 環境下でコマンドをより便利に使うための重要な考え方については以下のような素晴らしい記事が公開されていますので必要に応じてこれらの記事を参照頂ください。

【連載】#33 バッチファイルから Cygwin の bash を実行し 4つのCSVファイルを結合する

Cygwin の bash を実行するバッチファイルの作成

まず Cygwinbash を実行するバッチファイルとして次のバッチファイル

  • 結合_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 の実行方法

バッチファイルから Cygwinbash を実行するときは次のように記述します。

\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 互換コマンド が使えます。

【連載】#33 バッチファイルから Cygwin の bash を実行し 4つのCSVファイルを結合する

そして 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 やこれらの変数、環境変数等に関連した一般的なバッチファイルの書き方については必要に応じて

【Windows業務効率化】バッチファイルの基本テクニックを知ろう

も参考にしてください。

ツールの修正内容

作成_東京都コロナウイルス_発症者推移グラフ.bat の修正

以上をふまえ

【連載】#26 リファクタリング後のフォルダ構成とバッチファイル を確認しよう

で紹介した東京都コロナウイルスに関連した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 関数が一度だけ実行されています。

【連載】#33 バッチファイルから Cygwin の bash を実行し 4つのCSVファイルを結合する

続いて修正後の 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回実行しています。

【連載】#33 バッチファイルから Cygwin の bash を実行し 4つのCSVファイルを結合する

つまりたったこれだけの変更で
東京都の

※「全期間一括データ」はファイルサイズの制限により2022年3月18日以降更新を停止しています。申し訳ありませんが、「年別分割データ」をご利用ください。

という方針変更に対応できた訳です。

まとめ

いかがですか?

今回は バッチファイル から Cygwin の bash を実行し 4つのCSVファイル を結合する方法を紹介しました。

この Cygwin 環境を使用すると Windows 環境下で bashsedgrepawk といった通常 UNIX/Linux でしか利用できない便利なツールを 標準入出力リダイレクションパイプ といった重要な考え方と共に利用することができます。

興味のある方は Windows 10 搭載 PCへの導入の検討されてはいかがでしょうか。

次の記事からはいよいよ Access のテーブル間リレーションを使ったクエリ操作を行い、

【連載】#33 バッチファイルから Cygwin の bash を実行し 4つのCSVファイルを結合する

を描画するための元データを作成する

作成_T2040_日付_女性入院者数_男性入院者数_xlsx.accdb

の作成方法 について具体的に紹介します。

さてこの記事全体の目標は

  • 今の状況から抜け出してもっと前向きな仕事に取り組みたい
  • さっさと仕事を切り上げて充実したアフターファイブを過ごしたい

でしたよね。

あなたの解決したい問題は何ですか?

次回はまた

【連載】#34 Access の結合クエリを使いグラフ描画用データを作ろう

Access VBA の新しい窓を開きましょう。


【連載】#33 バッチファイルから Cygwin の bash を実行し 4つのCSVファイルを結合する
しらかば堂

この記事の投稿後 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 関連教材は次のリンクからどうぞ。

Access VBA 関連教材の紹介