CSVを行数で分割するときは、単にN行ずつ切るだけでは不十分です。各ファイルにヘッダーを付け、合計行数が元データと一致することまで確認します。
この記事では、見出し行(ヘッダー)を各ファイルに付けたまま、CSVを指定したデータ行数ごとに分割する手順を、Windows標準のPowerShellを使った例で整理します。対象は、行数やファイルサイズの制限で、1つのCSVのままでは開けない・取り込めないケースです。
先に結論
- 分割した各ファイルの先頭に、同じ見出し行を付ける。
- テキストを1行ずつ機械的に切る方法は、セル内改行を含むCSVを壊すことがある。CSVとして読み込んでから分割する。
- 分割後に、全ファイルのデータ行数の合計が元のデータ行数と一致するか確認する。
分割前に決めること
- 1ファイルあたりのデータ行数:取り込み先の上限に合わせます。見出し行は含めずに数えます。
- ファイル名:
sales_001.csv、sales_002.csvのように3桁の連番にすると、並べたときに順番が崩れません。 - 文字コード:元ファイルと同じ文字コード(UTF-8またはShift_JIS)で出力します。取り込み先に指定がある場合はそれに合わせます。
例えば、見出しを除いて10,003行のデータを5,000行ずつ分けると、sales_001.csv と sales_002.csv が5,000行、sales_003.csv が3行になります。各ファイルの先頭にはそれぞれ見出し行が付きますが、データ行数には含めません。
分割方法の選び方
| 方法 | 向いている場面 | 注意点 |
|---|---|---|
| PowerShell(Import-Csv / Export-Csv) | Windowsで、PCのメモリに収まる規模のCSV | ファイル全体を読み込むため、非常に大きいと時間がかかる |
| Excelで行を選んでコピー | 2〜3ファイルに分けるだけ | ワークシートは1,048,576行までなので、それを超えるCSVは全行を開けない |
split コマンドなど行単位で切るツール |
セル内改行がないと確認済みのCSV | 見出しが付かず、セル内改行があると行が途中で切れる |
PowerShellで分割する例
C:\data\sales.csv を5,000行ずつに分け、C:\data\split\ に保存する例です。
$src = "C:\data\sales.csv"
$outDir = "C:\data\split"
$size = 5000
New-Item -ItemType Directory -Path $outDir -Force | Out-Null
$rows = @(Import-Csv -Path $src -Encoding UTF8)
$total = $rows.Count
$n = 1
for ($i = 0; $i -lt $total; $i += $size) {
$last = [Math]::Min($i + $size, $total) - 1
$out = Join-Path $outDir ("sales_{0:D3}.csv" -f $n)
$rows[$i..$last] | Export-Csv -Path $out -NoTypeInformation -Encoding UTF8
$n++
}
"元のデータ行数: $total / 作成ファイル数: $($n - 1)"
- スタートメニューから「PowerShell」を開く。
$src(元ファイル)、$outDir(保存先)、$size(1ファイルあたりのデータ行数)を自分の環境に合わせて書き換え、貼り付けて実行する。- 保存先に
sales_001.csv、sales_002.csv… ができる。
Import-Csv が1行目を見出しとして読み込み、Export-Csv が各ファイルの先頭に見出しを書き出します。引用符で囲まれたセル内改行も1つの値として扱われるため、行の途中で切れることはありません。
文字コードと出力形式の注意:
- 元ファイルがShift_JIS(CP932)の場合、Windows PowerShell 5.1では2か所の
-Encoding UTF8を-Encoding Defaultに変えます。 - Windows PowerShell 5.1の
Export-Csvは、すべての値を"で囲み、-Encoding UTF8ではBOM付きで出力します。取り込み先のシステムがこの形式を受け付けるか、最初の1ファイルで試してください。 - PowerShell 7では文字コードの既定値や指定方法が異なるため、出力したファイルを開いて文字化けがないか確認します。
分割結果を照合する
$orig = @(Import-Csv -Path "C:\data\sales.csv" -Encoding UTF8).Count
$sum = 0
foreach ($f in Get-ChildItem "C:\data\split\sales_*.csv") {
$c = @(Import-Csv -Path $f.FullName -Encoding UTF8).Count
"{0}: {1}行" -f $f.Name, $c
$sum += $c
}
"元: $orig 行 / 分割合計: $sum 行"
「元」と「分割合計」が一致し、最後のファイル以外がすべて指定した行数になっていれば完了です。あわせて、最初と最後のファイルを開き、見出し行があること、文字化けしていないことを目で確認します。
よくある失敗
- テキストエディターで行を切り取って分割し、2つ目以降のファイルに見出しを付け忘れる。
- テキストの行数で数えて、セル内改行を含む行の途中で切ってしまう。
- 分割したファイルを元ファイルと同じフォルダーに保存し、どれが元データかわからなくなる。
このページでは扱わないこと
店舗別・担当者別など、列の値ごとに分ける方法は扱いません。出力するファイルの決め方が異なるため、別のページで説明しています。
次に確認するページ
- 列の値ごとに分割したい:CSVを列の値ごとに分割する方法|店舗・担当者・月別に切り出す
- 分割したCSVを1つに戻したい:同じ形式のCSVを複数まとめて1つに結合する方法
参考
- Microsoft: Import-Csv / Export-Csv(PowerShell ドキュメント)
確認日: 2026-09-28
