PowerShellでは、CSVを単なる文字列ではなく「列名をプロパティとして持つオブジェクト」として扱えます。本記事では、複数の旧記事に分かれていた読込、行数・要素数の取得、1行ずつの処理、列追加、ヘッダー変更、連想配列化、出力を一つの手順にまとめます。

検証日:2026年9月11日

対象:Windows PowerShell 5.1、PowerShell 7.6。文字コードの既定値が異なるため、業務ファイルでは -Encoding を明示してください。

サンプルCSV

以下を users.csv として保存します。

Id,Name,Department
1,Sato,Sales
2,Suzuki,IT
3,Tanaka,Sales

Import-Csvで読み込む

$rows = Import-Csv -LiteralPath '.\users.csv' -Encoding utf8
$rows

期待結果は、IdNameDepartment を列に持つ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ではデータ件数と一致しないため注意が必要です。

1行ずつ処理する

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 も使えますが、入力を保持したい処理では新しいオブジェクトを作る方が安全です。

ヘッダーを付け替える・2行目から読む

ヘッダーがないファイルには -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が複数あると後の行で上書きされるため、重複を許す場合は値を配列にしてください。

Export-Csvで保存する

$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 を検討します。受け渡し先の仕様を確認し、同じファイルへ追記するときも文字コードを統一してください。

区切り文字と大容量CSV

タブやセミコロン区切りは -Delimiter、OSの地域設定に合わせる場合は -UseCulture を使います。

Import-Csv '.\data.tsv' -Delimiter "`t" -Encoding utf8
Import-Csv '.\local.csv' -UseCulture

Import-Csv は全件をメモリへ展開します。数GB級のファイルでは、データベースや専用パーサーの利用、ファイル分割を検討してください。Get-Content による単純な1行処理は高速化に使えますが、引用符内改行などCSVの仕様を正しく扱えない場合があります。

よくある失敗

  • 日本語が文字化けする:入力側と -Encoding が一致しているか確認する
  • 全体が1列になる:実際の区切り文字と -Delimiter を合わせる
  • 数値の並び順がおかしい:文字列のまま比較せず型変換する
  • 出力列が揃わない:パイプラインへ流すオブジェクトのプロパティを統一する
  • Get-Content の件数とExcelの行数が違う:セル内改行の有無を確認する

公式資料

Previous Post Next Post