PowerShell: CSV・TSVファイルの読み込み

PowerShellでカンマ区切りのCSVファイルやタブ区切りのTSVファイルを読み込む場合、 Import-Csvコマンドレットを使います。 -Delimiterパラメータで区切り文字を指定することで、 カンマやタブだけでなく他の区切り文字のファイルも読み込むことができます。

Import-Csvの書式

書式
Import-Csv ファイル名 -Delimiter 区切り文字 -Encoding 文字コード

ファイル名には読み込むCSVファイルやTSVファイルを指定します。

-Delimiterで区切り文字を指定します。デフォルトはカンマ(,)です。 タブ区切りの場合は「`t」(バッククォート + t)を指定します。 多くのプログラミング言語ではタブを表す場合「\t」としますが、 PowerShellでは特殊文字はバッククォート「`」を使うので注意が必要です。 カンマやタブだけでなく「:」などの任意の文字も指定できます。

-Encodingで文字コードを指定します。utf-8の場合は「utf8」と指定します。 Windows環境でShift-JISのファイルを読み込む場合は「oem」を指定してください。 文字コードの指定方法はPowerShellのバージョンによって異なる場合があります。 文字化けする場合はオンラインマニュアルで指定方法を確認してください。 PowerShellのプロンプト上で「Get-Help Import-CSV -Online」と入力すると ブラウザでマニュアルが表示されます。

ファイルの読み込み

次のようなカンマ区切りのファイル「test.csv」を読み込みます。

id,name,year
1,田中,2001
2,佐藤,2002
3,鈴木,2000
Import-Csv test.csv -Encoding utf8
デフォルトの区切り文字はカンマ(,)なので -Delimiterパラメータを指定する必要はありません。 もしタブ区切りのTSVファイルの場合は「`t」を指定してください。

実行結果
id name year
-- ---- --------
1  田中 2001
2  佐藤 2002
3  鈴木 2000

先頭行(1行目)の取り扱い

Import-Csvコマンドレットは先頭行を見出し行(ヘッダー)として読み込みます。 ヘッダーがなく1行目からデータが格納されているファイルの場合、 -Headerパラメータで見出しを指定します。

次のような見出し行(ヘッダー)のないファイル「test2.csv」を読み込む場合、

1,田中,2001
2,佐藤,2002
3,鈴木,2000
Import-Csv test2.csv -Header ID,名前,生年月日

-Headerパラメータでヘッダーをカンマ区切りで指定します。 すると次のように表示されます。

実行結果
id name year
-- ---- --------
1  田中 2001
2  佐藤 2002
3  鈴木 2000

もし-Headerパラメータを指定しないと、 次のように 1行目のデータをヘッダーと見なしてしまい、 おかしな表示となります。

Import-Csv test2.csv

# 実行結果

1 田中 2001
- ---- ----
2 佐藤 2002
3 鈴木 2000

ファイルの内容を変数に格納する

これまでは読み込んだファイルの内容を表示するだけでしたが、 変数に格納して処理することもできます。

「test.csv」ファイルを読み込んで変数に格納し、 name列の値だけを表示してみます。

id,name,year
1,田中,2001
2,佐藤,2002
3,鈴木,2000
$rs = Import-Csv test.csv

foreach ($r in $rs) {
	Write-Host $r       # 行を表示
	Write-Host $r.name  # name列のみ表示
}
実行結果
@{id=1; name=田中; year=2001}
田中
@{id=2; name=佐藤; year=2002}
佐藤
@{id=3; name=鈴木; year=2000}
鈴木

Import-Csvコマンドレットの結果は1行ずつ配列として格納されています。 各行を表す$rを表示してみると、連想配列となっていることがわかります。 ですから「name」列を取得する場合は「$r.name」と記述します。 つまりImport-Csvの内容は「連想配列の配列」となっています。

PowerShell