トッカンソフトウェア

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はタブ文字指定の場合。



ページのトップへ戻る