PowerShellでCSVファイルの列を動的に合成する ― 2017/03/11 11:30
仕事でCSVファイルを読み込んで列を抽出、並び替えて、追加もする必要がありました。
VBScriptで組むのはCSVの取り扱いが煩雑そうだし、統合環境もないというのはやる気が萎えます。
Excel VBAで組むならCSVの取り扱いは問題ないとしても、マクロのセキュリティが面倒くさいし、エクセルファイルを介するのもどうかと思います。
というわけで、クセがあって乗り気がしないPowerShellで組むことにしました。
とりあえず、要求されている仕様は満たしたものの、欲を出して列を動的に合成したくなりました。これができれば各人好みの列を設定ファイルで指定することができるようになります。
が、しかし、ここではまりました。いっくらやっても列の値が全列を足したものになってしまいます。色々やってもうまくいかなくて昨日は帰ってきてしまいましたが、どうにも気になったのでさっき再度試したらあっさりOK。
これで今日も思う存分飲むことができます。
( ̄^ ̄)
ちなみにコードはこんな感じ。CSVファイルに開始、終了、種類の列があることが前提です。それらの列を連結してNewColumnという列が作られます。
Set-StrictMode -Version 2.0
$uColumns = "開始,終了,種類"
$uDESKTOP = [Environment]::GetFolderPath('Desktop')
$uCSVin = Join-Path $uDESKTOP "Input.csv"
$uCSVout = Join-Path $uDESKTOP "Output.csv"
$uNewColumn =
@{
name = "NewColumn"
expression =
{
$uArray = $uColumns -split ","
$uExpression = ""
foreach ( $uElement in $uArray )
{
$uExpression += $_.$uElement + " "
}
$uExpression.Trim()
}
}
Import-Csv -Encoding Default $uCSVin |
Select-Object $uNewColumn |
Export-Csv -Encoding Default -NoTypeInformation $uCSVout
字下げはこのブログの仕様で(?)失われます。HTML化すればできるだろうけれど面倒だからやりません。
( ̄^ ̄)
会社でやった時は$_.$uElement の部分を ""で囲んでいたのが失敗の原因だったようです。
"$_.$uElement"とすることにより、ドット演算子が機能しなくなり$_の部分が展開されていたようです。一応部分演算子も試してみたのですが、職場ではなぜかうまくいきませんでした。
部分演算子を使う場合には、次のように書きます。
$uExpression += "$($_.$uElement) "
要素ごとに、改行したい場合には次のように書きます。
$uExpression += "$($_.$uElement)`n"
改行すると標準のCSVではなくなるようなので注意が必要です。ExcelとかOutlookは処理できるようですが。上記LFでの改行はOutlook用のつもりです。
ちなみにtrim()は最後の空白を消す処理です。気にならなければ、trim()は不要です。
参考にしたのは、次のページです。
http://mtgpowershell.blogspot.jp/2010/11/select-object.html
ありがとうございます。
2017/03/18
息をするのも面倒くさかったけれど、 pre と code タグを追加してみました。フォント情報も失われたけれど、まあええか。ググるのも面倒くさいし。
( ̄^ ̄)
preをつけると<>が&キーワード表示されてしまう場合があるらしい。それでたまにそうなっているサイトがあるのだろうか?
http://www.htmq.com/html/pre.shtml
うっわ、ハイパーリンクも失われてしまった。リンク張らねば。
やはり面倒くさい。
(-_-;)
そして、いずれ引っ越しする際に邪魔になるやもしれん。なので、戻すことにしました。
( ̄^ ̄)
最近のコメント