バッチファイルでcsvの内容を読み取る

bat bat

バッチファイルでcsvの内容を読み取ってみました。
テキストファイルの読み取りの応用に当たります。

バッチファイルでテキストファイルを読み取る方法は上記の記事にまとめていますので参考にしてください。

広告

ファイルを読み取る

今回はcsvファイルの内容を読み取ってみます。

今回は単純に id、名前(name)、年齢(age)、出身地(birthplace) の4つの情報があるcsvファイルを用意します。

id,name,age,birthplace
1,taro,23,tokyo
2,jiro,26,akita
4,saburo,27,nagano
8,siro,21,nagasaki
11,goro,32,gunma
13,takeshi,25,okinawa
19,takuya,45,toyama
24,rumi,24,aomori
26,kumi,24,ibaraki
29,kyouko,27,tokyo
31,itiro,29,kanagawa
32,mei,31,ehime
45,akari,20,tokyo

1.すべての情報を取得する

以下のコマンドで全ての情報を取得することが可能です。
[delims] オプションを利用して各行のすべての値を取得します。

chcp 65001
@echo off

for /f "delims=" %%i in (csv-test.csv) do (
  echo %%i
)

pause

実行結果

すべての情報を取得するバッチコマンドの実行結果

全ての値を取得することができました。

2.idと年齢(age)だけを取り出す

次に id列age列を取り出してみます。
やっていることはエクセルで1列目と3列目を取り出すような操作を実施している形になります。

ここでは [tokens] オプションと [delims] オプションを組み合わせて取り出します。

chcp 65001
@echo off

for /f "tokens=1,3 delims=," %%i in (csv-test.csv) do (
  echo %%i %%j
)

pause

コマンドの解説

[delims] オプションを利用して各行を「,」で区切り、[tokens] オプションを利用して区切った単位の1番目と3番目の値を取り出します。(この区切った単位のことを「トークン」と呼びます)

また、tokens で指定したトークンが複数ある場合には、for で指定した変数を起点として、アルファベット順に順々に格納されていきます。
今回は %%i を指定していますので、アルファベット順の次に当たる j に次の値が格納されているということになります。

実行結果

idと年齢(age)だけを取り出すバッチコマンドの実行結果

id列age列だけを取り出すことができました。

3.出身地(birthplace)が「tokyo」の人だけを取り出す

最後に出身地(birthplace)が「tokyo」の人だけを取り出します。
やっていることはエクセルでフィルター処理の操作を実施している形になります。

ここでは for コマンド を利用して取りだします。

chcp 65001
@echo off

for /f "tokens=1-4 delims=," %%i in (csv-test.csv) do (
  if %%l==tokyo (
    echo %%i %%j %%k %%l
  )
)

pause

コマンドの解説

ここでも [delims] オプションを利用して各行を「,」で区切り、 [tokens] オプションを利用して全ての行をトークンに含まれるように指定します。

変数 %%l には、birthplace の列が格納されているので、それが tokyo に一致する場合にその列を出力します。

実行結果

出身地(birthplace)が「tokyo」の人だけを取り出すバッチコマンドの実行結果

出身地(birthplace)が「tokyo」の人だけを取り出すことができました。

[注意点] tokensで指定できる数に制限がある

tokens で格納することができる数には 26 という上限があります。
これはアルファベット文字数しかトークンの変数として定義できないためです。

なので、バッチファイルでのデータ処理自体あまり想定されないと思いますが、大量のデータを処理するには不向きなのでRやpythonで解析したほうが無難です。

上限値の挙動を試す

以下のcsvファイルとバッチファイルを用意して試してみます。

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26
chcp 65001
@echo off

for /f "tokens=1-26 delims=," %%a in (csv-test4.csv) do (
  echo %%a %%z
)

pause

実行結果

a=1番目の 「1」と、z=26番目の「26」という値を出力できていることが分かります。

tokensで指定できる数に制限があることを確かめるコマンド実行結果

アルファベットを大文字にしても同じ結果となる

大文字のアルファベットを利用しても同じ結果となります。
実行したコマンドが分かるように「@echo off」を除いて実行しています。

アルファベットを大文字にしても同じ結果となる

トークンの値を32以上には指定できない

トークンの値を「1-32」などに指定した場合には、求めている値は返ってきません。
実行したコマンドが分かるように「@echo off」を除いて実行しています。

・1‐31 を指定

1‐31 を指定

・1‐32 を指定

1‐32 を指定

ただ、1-31 を指定してもアルファベットは26文字なので5文字分の変数がどこに格納されているのかは分かりません。

ですが 32 以上を指定するとエラーとなることだけは覚えておくといいのかなと思いました。

コメント

タイトルとURLをコピーしました