CSVを読み込んだら、行全体がひとつの列名になっている。文字コードだけでなく、区切り文字が合っているかを確認してください。拡張子が.csvでも、出力元によってはセミコロンやタブで区切られています。
PowerShellのImport-Csvは、区切りを-Delimiterで指定できます。CSVを行ごとにSplitする処理へ置き換える前に、引用符の中に区切り文字が入る例も使い、読み方を確かめます。
セミコロンの練習用CSV
次は一時フォルダーへ架空の2件を保存し、セミコロンで読み込む例です。備考の「確認;済み」は引用符で囲まれているので、ひとつのセルとして扱います。
$practiceDir = Join-Path ([IO.Path]::GetTempPath()) ('csv-delimiter-' + [guid]::NewGuid())
[IO.Directory]::CreateDirectory($practiceDir) | Out-Null
$csvFile = Join-Path $practiceDir 'practice.csv'
$csvText = @'
id;備考
A01;"確認;済み"
A02;未確認
'@
Set-Content -LiteralPath $csvFile -Value $csvText -Encoding UTF8
$rows = @(Import-Csv -LiteralPath $csvFile -Delimiter ';' -Encoding UTF8)
$rows.Count
$rows[0].id
$rows[0].備考
期待する結果は2件、最初のIDがA01、備考が確認;済みです。区切りのセミコロンと、引用符の内側にあるセミコロンを区別できているかを見ます。データの保存と読み取りには、どちらもUTF-8を指定しています。
区切り文字の指定を変える
タブ区切りなら、PowerShellでは-Delimiter "`t"のようにタブの文字を指定します。カンマ区切りなら-Delimiter ','です。-UseCultureは環境のリスト区切り文字に合わせる指定なので、入力仕様が決まっている業務で使う場合は、その環境依存も確認します。
列が一つになった場合は、まずテキストとして見出しと数行を読み、どの文字が区切りに使われているかを確認します。画面上の表だけを見て、カンマだと決めないようにしてください。文字コードを変えても、区切りの指定が違う問題は直りません。
引用符の中を分割しない
単純に;で文字列を分けると、例の「確認;済み」まで二つに分かれます。カンマや改行を含むセルでも、CSVの引用ルールを考える必要があります。表を読む用途では専用の読込処理を使い、セルの意味を保ちます。
先頭の行は通常、列名として扱われます。列名が重複したり空欄になったりするデータでは、読めた後のプロパティ名も確認します。必要な見出しがそろい、データ行の数が元と一致していることを、別の検査として残してください。
行数と読み込んだ件数
引用符の中に改行があるCSVでは、テキストの行数とデータの件数が一致しない場合があります。ファイルの改行数だけを数えて、取り込み件数が合っていると判断しないようにします。入力例と読込結果を対応させ、1件がどこからどこまでかを確認します。
この例はWindows PowerShell 5.1とPowerShell 7でセミコロンと引用符の読み取りを確認する範囲です。実データのすべての不備に対応した取込ツールではありません。業務へ加える場合は、区切り、文字コード、列名、空欄の扱いを入力条件としてそろえてください。
関連する記事
Pythonでファイルを読み書きする基本|txt・csv・jsonの使い分け
公式資料
Import-Csv (Microsoft.PowerShell.Utility) – PowerShell | Microsoft Learn
