#はじめに
PowerShellを用いて、CSVを読み込み別フォーマットのCSVとして出力する方法。
#手順
Import-CSVを使用してCSVを読み込む。
Get-Contentを使用してもCSVの読み込みが行えるが、文字列としてに,(カンマ)が含まれているとずれてしまうのでImport-CSVを使用した方がよい。
$csv_a = Import-CSV -Encoding Default "入力.csv"
PsCustomObjectとして読み込まれる。
PS > $csv_a[0]
商品コード 商品名 個数 単価
---------- ------ ---- ----
0001 バナナ 10 100
データはJSON形式で管理しているっぽい。
PS > $csv_a
:
BaseObject : {@{商品コード=0001; 商品名=バナナ; 個数=10; 単価=100}, @{商品コード=0002; 商品名=レモン; 個数=20;
単価=50}}
項目数が想定と一致しているのか確認する。
if ( $csv_a[0].psobject.properties.Name.Length -ne 4 ) {
exit
}
中身がJSONなので、こんな書き方でも可能。
if ( ($csv_a[0] -split ';').Length -ne 4 ) {
exit
}
出力用の項目を指定しながら値をセット。
[System.Array] $ExportDat = $null
foreach($line_a in $csv_a){
$tmpDat = New-Object psobject
$tmpDat | Add-Member -MemberType NoteProperty -Name "名称" -Value $line_a.商品名
$tmpDat | Add-Member -MemberType NoteProperty -Name "金額" -Value ([int]$line_a.単価*[int]$line_a.個数)
$ExportDat += $tmpDat
}
CSV形式で出力。
$ExportDat | Export-Csv -NoTypeInformation "出力.csv" -Encoding Default
CSVを出力する際に、ヘッダを出力したくない場合にはExport-Csvを使わずにConvertTo-Csvで出力を行い、-skip 1でヘッダ行をスキップする。
また、ダブルクォーテーションを付与したくない場合には-replaceで置換を行う。
$ExportDat | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1 | % {$_ -replace '"',''} | Set-Content "出力.csv"
#終わりに
Cとかでがりがり組むのと比べて速度にちょっと難はあるけど、ちょっとしたデータの加工にはなかなか便利。