ある表データの利用が必要になったのですが、各項目が”[カラム名]=[値]”で表記されており、スペースで区切られているという変わった書式になっていました。
これだけならまだしも、値のないカラムはカラム名ごと省略されており、カラム名とスペースをカンマで置き換えても値がずれるという面倒な書式でした。
ちょうどこんな感じです。
<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も表計算ソフトでスムーズに読み込めるのでこれで良いかなと思います。