Powershellの正規表現を使ったcsvの整形

ある表データの利用が必要になったのですが、各項目が”[カラム名]=[値]”で表記されており、スペースで区切られているという変わった書式になっていました。

これだけならまだしも、値のないカラムはカラム名ごと省略されており、カラム名とスペースをカンマで置き換えても値がずれるという面倒な書式でした。

ちょうどこんな感じです。

<Powershell>
$str = @(
    "pref=saitama city=saitama ward=urawa machi=kitaurawa",
    "pref=saitama city=kumagaya machi=honcho
"
)

2行目の方にも”ward=”という空の表記があれば列が揃うのですが、このままだとwardの値とmachiの値が混ざってしまいます。

Powershellは正規表現が使えるとのことだったので、勉強がてら変換を試してみることにしました。できあがりはこんな感じです。

<Powershell>
#加工する文字列
$str = @(
    "pref=saitama city=saitama ward=urawa machi=kitaurawa",
    "pref=saitama city=kumagaya machi=honcho"
)

#city=[何とか]の次がmachi=[何とか]だった場合ward=を挿入
$str = $str -replace '(city=[a-z]+) machi=','$1 ward= machi='

#[カラム名]=を削除
$str = $str -replace '[a-z]+=',''

#スペースをカンマに変換
$str = $str -replace '\s',','

#ヘッダ変数
$header = "pref,city,ward,machi"

#ヘッダを配列の先頭に挿入
$str = @($header) + $str

#文字列をcsv出力
$str | Out-File "C:\hoge\hoge.csv" -Encoding UTF8

今回のケースでは一致したcityの値を置き換え後の文字列でも使用したかったのですが、これは正規表現のグループ化という機能で実現可能です。

正規表現の条件指定部分を()でくくっておくと、置き換え後の文字列で$1という名前で参照できます。上の例では配列の2つ目の値でcity=kumagayaという文字列を検索条件に使いつつ、置き換え後文字列で改めて呼び出しています。

出力されたcsvも表計算ソフトでスムーズに読み込めるのでこれで良いかなと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

スパム対策のため、日本語が含まれないコメントは投稿できません。