PowerShellでは、CSVを単なる文字列ではなく「列名をプロパティとして持つオブジェクト」として扱えます。本記事では、複数の旧記事に分かれていた読込、行数・要素数の取得、1行ずつの処理、列追加、ヘッダー変更、連想配列化、出力を一つの手順にまとめます。
検証日:2026年9月11日
対象:Windows PowerShell 5.1、PowerShell 7.6。文字コードの既定値が異なるため、業務ファイルでは -Encoding を明示してください。
以下を users.csv として保存します。
Id,Name,Department
1,Sato,Sales
2,Suzuki,IT
3,Tanaka,Sales
$rows = Import-Csv -LiteralPath '.\users.csv' -Encoding utf8
$rows
期待結果は、Id、Name、Department を列に持つ3件のオブジェクトです。パスに角括弧などが含まれても安全なように、固定パスには -LiteralPath を勧めます。
列へは次のようにアクセスできます。
$rows[0].Name
$rows | Select-Object Name, Department
$rows | Where-Object Department -eq 'Sales'
$rowCount = @($rows).Count
$columnCount = @($rows[0].PSObject.Properties).Count
"行数: $rowCount"
"列数: $columnCount"
1件だけのCSVでも確実に配列として数えるため、@(...) で囲みます。この例では行数3、列数3です。ファイルの物理行数を Get-Content で数える方法は、引用符内の改行を含む正しいCSVではデータ件数と一致しないため注意が必要です。
foreach ($row in $rows) {
"{0}: {1}" -f $row.Id, $row.Name
}
パイプラインで処理する場合は次のように書けます。
$rows | ForEach-Object {
[pscustomobject]@{
Id = [int]$_.Id
Name = $_.Name.Trim()
}
}
CSVから読み込んだ値は基本的に文字列です。数値として比較・計算するときは [int] や [decimal] へ明示的に変換します。
既存データから計算した列を加えるなら、Select-Object の計算プロパティが簡潔です。
$result = $rows | Select-Object *, @{
Name = 'Email'
Expression = { '{0}@example.com' -f $_.Name.ToLowerInvariant() }
}
$result | Format-Table
期待結果は元の3列に Email が加わった4列です。各オブジェクトを直接変更する場合は Add-Member も使えますが、入力を保持したい処理では新しいオブジェクトを作る方が安全です。
ヘッダーがないファイルには -Header を指定します。
$rows = Import-Csv '.\no-header.csv' -Header Id, Name, Department
先頭行が説明文で、2行目が本来のヘッダーなら、説明行だけを除いて ConvertFrom-Csv へ渡します。
$rows = Get-Content '.\with-note.csv' -Encoding utf8 |
Select-Object -Skip 1 |
ConvertFrom-Csv
ただし、セル内改行を含むCSVを行単位で加工すると壊れる可能性があります。可能なら出力元で正しいヘッダーを付けてください。
IDから何度も検索する場合はハッシュテーブルに変換します。
$byId = @{}
foreach ($row in $rows) {
$byId[$row.Id] = $row
}
$byId['2'].Name
期待結果は Suzuki です。同じIDが複数あると後の行で上書きされるため、重複を許す場合は値を配列にしてください。
$result | Export-Csv -LiteralPath '.\users-updated.csv' `
-NoTypeInformation -Encoding utf8
PowerShell 7系の utf8 はBOMなしUTF-8です。Windows PowerShell 5.1でExcelとの受け渡しを優先する場合は、環境に応じて -Encoding UTF8(BOM付き)や Unicode を検討します。受け渡し先の仕様を確認し、同じファイルへ追記するときも文字コードを統一してください。
タブやセミコロン区切りは -Delimiter、OSの地域設定に合わせる場合は -UseCulture を使います。
Import-Csv '.\data.tsv' -Delimiter "`t" -Encoding utf8
Import-Csv '.\local.csv' -UseCulture
Import-Csv は全件をメモリへ展開します。数GB級のファイルでは、データベースや専用パーサーの利用、ファイル分割を検討してください。Get-Content による単純な1行処理は高速化に使えますが、引用符内改行などCSVの仕様を正しく扱えない場合があります。
-Encoding が一致しているか確認する-Delimiter を合わせるGet-Content の件数とExcelの行数が違う:セル内改行の有無を確認する