[Powershell]Import-Csvの空白の扱いがなんだか微妙

概要

Import-Csvで、csvファイル内の空白の扱いには注意が必要。
* デリミタ記号の前に空白を入れない
* デリミタ記号の前後に連続した空白を使用する場合、””で括るようにする

解説

ヘッダ行のデリミタ前後に空白がない場合

column_a ,column_b ,column_c
a1,b1,c1
a2,b2,c2
a3,b3,c3
a4,b4,c4
a5,b5,c5

この場合は正常に読めます。
csv01

デリミタの前に空白がある場合

column_a ,column_b ,column_c
a1       ,b1       ,c1
a2       ,b2       ,c2
a3       ,b3       ,c3
a4       ,b4       ,c4
a5       ,b5       ,c5

この場合読めません。
csv02
というか、カラム指定を”column_b “(後ろに1つ空白入れる)にすると読めます。
csv03
デリミタ前の空白は2つ以上でも、ヘッダ名には空白1個付いた状態になります。

column_a ,column_b            ,column_c
a1       ,b1                  ,c1
a2       ,b2                  ,c2
a3       ,b3                  ,c3
a4       ,b4                  ,c4
a5       ,b5                  ,c5

csv04

デリミタの後に空白がある場合

column_a,  column_b,  column_c
a1,        b1,        c1
a2,        b2,        c2
a3,        b3,        c3
a4,        b4,        c4
a5,        b5,        c5

この場合、ヘッダ名は空白なし…つまり、デリミタ前後に空白を入れなかったケースと同じになります。
csv05

データも同じように処理されているっぽいので、Import-Csvでは「デリミタ記号の前にある連続した半角空白は、1つの半角空白として取り扱われる」ようです。ややこしいので、このようなcsvは指定しないようにした方が良さそうです。
なお、””で括った場合は、括られた文字列通りに扱われます。

まとめ

通常は次の点に注意しておく必要がありそうです。
* デリミタ記号の前に空白を入れない
* デリミタ記号の前後に連続した空白を使用する場合、””で括るようにする

余談

vimのAlignでcsvを整形すると、デリミタの前後に半角空白が入るんだよ…

コメントを残す