PowerShell CSVファイル関連
PowerShellのCSVファイルの入出力をまとめます。サンプルCSVファイル(testUTF8.csv)
サンプルCSVファイルとして以下の内容でファイルを作成しておきます。ファイル名は testUTF8.csv とします。
a,b,c
a"aa,あああ,0
bbb,いいい,1
bbb,ううう,2
test.csvファイルも説明で使用しますが、中身は省略。
CSVファイルの読み込み
Set-Location c:\work\hp
$csv = Import-Csv test.csv
Write-Output $csv
文字化けする場合、-Encodingを付けると解消されます。
シフトJISの場合、DefaultかOEM、UTF8の場合、UTF8を指定します。
$csv = Import-Csv test.csv -Encoding Default
$csv = Import-Csv test.csv -Encoding OEM
$csv = Import-Csv testUTF8.csv -Encoding UTF8
CSVのデータを1行ごとにループ
Set-Location c:\work\hp
$csv = Import-Csv testUTF8.csv -Encoding UTF8
$clms = @("a", "b", "c");
# CSVファイルの1行ごとにループ
# 1行目はカラム名になる
foreach ($data in $csv) {
# .の後ろにカラム名で指定します。
Write-Output $data.a
# カラム名は変数でもOK
foreach ($clm in $clms) {
Write-Output $data.$clm
}
}
# 上のループとやっていることは同じ
$csv | ForEach-Object {
Write-Output $_.a
# ForEachをネストする場合は、$_を別変数に格納します
$obj = $_
$clms | ForEach-Object {
Write-Output $obj.$_
}
}
ファイルに出力
Set-Location c:\work\hp
$csv = Import-Csv testUTF8.csv -Encoding UTF8
$csv | Export-Csv output1.csv -Encoding UTF8 -NoTypeInformation
$d = ','
$UTF8NoBom = New-Object System.Text.UTF8Encoding $False
$csvOut = $csv | ConvertTo-Csv -Delimiter $d -NoTypeInformation
$csvNoDq = $csvOut | ForEach-Object { $_ -replace '^"', '' -replace "`"$d`"", $d -replace '"$', '' }
[System.IO.File]::WriteAllLines("c:\work\hp\output2.csv ", $csvNoDq, $UTF8NoBom)
$clms = $csv | Get-member -MemberType 'NoteProperty' | Select-Object -ExpandProperty 'Name'
$output = @()
foreach ($data in $csv) {
$ary = @()
foreach ($clm in $clms) {
$ary += $data.$clm
}
$output += [string]::Join($d , $ary)
}
[System.IO.File]::WriteAllLines("c:\work\hp\output3.csv ", $output, $UTF8NoBom)
output1.csv
"a","b","c"
"a""aa","あああ","0"
"bbb","いいい","1"
"bbb","ううう","2"
output2.csv
a,b,c
a""aa,あああ,0
bbb,いいい,1
bbb,ううう,2
output3.csv
a"aa,あああ,0
bbb,いいい,1
bbb,ううう,2
先頭~、~末尾行のみ処理
Set-Location c:\work\hp
$csv = Import-Csv testUTF8.csv -Encoding UTF8
$csvFirst = $csv | Select-Object -First 1
$csvLast = $csv | Select-Object -Last 1
$csvFirst | Format-Table
$csvLast | Format-Table
Format-Tableは表形式で出力。
実行結果
a b c
- - -
a"aa あああ 0
a b c
- - -
bbb ううう 2
ソート指定
Set-Location c:\work\hp
$csv = Import-Csv testUTF8.csv -Encoding UTF8
$csvSort = $csv | Sort-Object -Property a, b -Descending
$csvSort | Format-Table
実行結果
a b c
- - -
bbb ううう 2
bbb いいい 1
a"aa あああ 0
Where条件
Set-Location c:\work\hp
$csv = Import-Csv testUTF8.csv -Encoding UTF8
$csvWhere = $csv | Where-Object { $_.c -ge 1 }
$csvWhere | Format-Table
実行結果
a b c
- - -
bbb いいい 1
bbb ううう 2
条件指定
条件指定 | 意味 |
---|---|
-eq | == |
-ne | != |
-gt | > |
-ge | >= |
-lt | < |
-le | <= |
-like | Like検索(含まれる)。ワイルドカード文字は* |
-notlike | Like検索(含まれない) |
-match | 正規表現(含まれる) |
-notmatch | 正規表現(含まれない) |
グループ化とグループごとの合計計算
Set-Location c:\work\hp
$csv = Import-Csv testUTF8.csv -Encoding UTF8
$csvGroup = $csv | Group-Object a
$csvGroup | Format-Table
$csvSum = $csv | Group-Object a | Select-Object Name,@{Name="c_sum"; Expression={($_.group | Measure-Object -sum c).Sum}}
$csvSum | Format-Table
実行結果
Count Name Group
----- ---- -----
1 a"aa {@{a=a"aa; b=あああ; c=0}}
2 bbb {@{a=bbb; b=いいい; c=1}, @{a=bbb; b=ううう; c=2}}
Name c_sum
---- -----
a"aa 0
bbb 3
ヘッダなしの場合、ヘッダを付ける
Set-Location c:\work\hp
$csv = Import-Csv testUTF8.csv -Encoding UTF8 -Header "aa", "bb", "cc"
$csv | Format-Table
実行結果
aa bb cc
-- -- --
a b c
a"aa あああ 0
bbb いいい 1
bbb ううう 2
区切り文字の指定
Set-Location c:\work\hp
$csv = Import-Csv testTab.csv -Encoding UTF8 -Delimiter "`t"
$csv | Format-Table
`tはタブ文字指定の場合。
ページのトップへ戻る