店舗別・担当者別など、列の値でCSVを分割する場合は、「グループごとの件数合計が元件数に戻るか」を確認すると漏れを見つけやすくなります。

この記事では、店舗・担当者・月など列の値をキーにして1つのCSVを複数のファイルに分け、分割後の件数が元の件数に戻るかを確認する手順を整理します。

先に結論

  • 分割キーにする列の空白・前後のスペース・表記ゆれを先に確認する。
  • 空白の行は捨てずに「未設定」ファイルへまとめる。
  • 月別に分けるときは、日付列から「2026-09」のような月キーを作ってから分ける。
  • グループごとの件数の合計と、元のデータ行数を照合する。

分割前に決めること

  • 分割キーにする列:店舗、担当者、注文日の月など、1列に決めます。
  • 空白の行の行き先:担当者列が空白の行を除外すると、分割後の件数合計が元の件数と合わなくなります。この記事では「未設定」ファイルにまとめます。
  • 元ファイルの保管:分割後も元ファイルは残します。件数が合わないときに原因を調べるために使います。

分割前にキーの値を一覧にする

分割する前に、キー列にどんな値が何件あるかを確認します。Excelなら[挿入]→[ピボットテーブル]で店舗列を「行」と「値」に入れると一覧と件数が出ます。PowerShellなら次のように確認できます。

Import-Csv -Path "C:\data\sales.csv" -Encoding UTF8 | Group-Object -Property 店舗 | Select-Object Name, Count

一覧に「東京」と「東京 」、「渋谷店」と「渋谷」のような似た値が並んでいたら、分割前にどちらに寄せるかを決めます。

方法1:グループが少ないならExcelのフィルターで切り出す

  1. [データ]→[フィルター]を設定する。
  2. 店舗列の▼から1つの値だけにチェックを入れる。空白の行は「(空白セル)」を選ぶ。
  3. 表示された行を見出しごと選択してコピーし、新しいブックに貼り付ける。
  4. [名前を付けて保存]で「CSV UTF-8 (コンマ区切り)」など、取り込み先に合う形式で保存する。
  5. すべての値について2〜4を繰り返す。

グループが10を超えるような場合は、手作業の漏れが起きやすいため方法2を使います。

方法2:PowerShellで一括分割する

C:\data\sales.csv を「店舗」列の値ごとに分け、C:\data\split\ に保存する例です。

$src    = "C:\data\sales.csv"
$outDir = "C:\data\split"
New-Item -ItemType Directory -Path $outDir -Force | Out-Null
$rows = @(Import-Csv -Path $src -Encoding UTF8)

# 分割キー:前後の空白を除き、空白は「未設定」にまとめる
$key = { $k = "$($_.店舗)".Trim(); if ($k -eq "") { "未設定" } else { $k } }

$groups = @($rows | Group-Object -Property $key)
foreach ($g in $groups) {
    $safe = $g.Name -replace '[\\/:*?"<>|]', '_'
    $g.Group | Export-Csv -Path (Join-Path $outDir "$safe.csv") -NoTypeInformation -Encoding UTF8
}
$sum   = ($groups | Measure-Object -Property Count -Sum).Sum
$files = @(Get-ChildItem -Path $outDir -Filter *.csv).Count
"元: $($rows.Count) 行 / グループ合計: $sum 行 / グループ数: $($groups.Count) / ファイル数: $files"
  • 店舗 の部分を、分割に使う列の見出し名に書き換えます。
  • ファイル名に使えない記号(\ / : * ? " < > |)は _ に置き換えています。
  • 前後の空白はグループ分けの前に取り除くため、「東京」と「東京 」は同じファイルにまとまります。
  • Group-Object は大文字・小文字を区別しません。区別したい場合は -CaseSensitive を付けます。
  • 元ファイルがShift_JIS(CP932)の場合、Windows PowerShell 5.1では2か所の -Encoding UTF8 を -Encoding Default に変えます。
  • スクリプトを .ps1 ファイルに保存して実行する場合、Windows PowerShell 5.1で日本語の列名を正しく読ませるには、BOM付きUTF-8で保存します。

最後の行で「元」と「グループ合計」が一致し、「グループ数」と「ファイル数」も一致すれば完了です。ファイル数のほうが少ない場合は、記号の置き換えで別々の値が同じファイル名になり、上書きされています(例:A/B と A_B)。

月別に分ける:日付から月キーを作る

日付列をそのまま分割キーにすると、日ごとのファイルになってしまいます。月別に分けるときは、日付を「2026-09」のような年月の文字列(月キー)に変換してから分けます。年を含めるのは、2025年9月と2026年9月のデータが同じファイルに入らないようにするためです。

Excelで月キー列を作る場合(注文日がB列にあるとき)

  • 日付として認識されている(右寄せで表示される)場合:=TEXT(B2,"yyyy-mm")
  • 文字列になっている(左寄せで表示される)場合:=TEXT(DATEVALUE(B2),"yyyy-mm")

#VALUE! になる行は日付の形式が想定外なので、分割前に元データを確認します。作った月キー列で、方法1のフィルターを使って切り出します。

PowerShellで月キーを作る場合

方法2のスクリプトの $key = ... の行を、次の内容に置き換えます(注文日 は日付列の見出し名に合わせます)。

$inv     = [Globalization.CultureInfo]::InvariantCulture
$formats = [string[]]@('yyyy/M/d', 'yyyy-M-d', 'yyyy/M/d H:mm', 'yyyy/M/d H:mm:ss')
$key = {
    $d = [datetime]::MinValue
    if ([datetime]::TryParseExact("$($_.注文日)".Trim(), $formats, $inv, 'None', [ref]$d)) {
        $d.ToString('yyyy-MM')
    } else {
        '日付不正'
    }
}

2026/9/5 や 2026-09-05 は 2026-09.csv に出力されます。想定外の形式の行は 日付不正.csv にまとまるので、このファイルができた場合は中身を確認し、$formats に形式を追加するか元データを修正してから分割し直します。

よくある失敗

  • キー列の空白行をフィルターで選び忘れ、その行がどのファイルにも入らない。
  • 日付をそのまま分割キーにして、日ごとの大量のファイルができてしまう。
  • 「9月」だけを月キーにして、異なる年の9月のデータが1つのファイルに混ざる。
  • 分割後に元ファイルを削除してしまい、件数が合わないときに原因を調べられない。

このページでは扱わないこと

データを5,000行ずつのように、決まった行数で機械的に分ける方法は扱いません。出力するファイルの決め方が異なるため、別のページで説明しています。

次に確認するページ

  • 決まった行数ごとに分割したい:大きなCSVを指定行数ごとに分割する方法
  • 分割したCSVを1つに戻したい:同じ形式のCSVを複数まとめて1つに結合する方法

参考

  • Microsoft: Import-Csv / Export-Csv / Group-Object(PowerShell ドキュメント)
  • Microsoft: TEXT 関数 / DATEVALUE 関数

確認日: 2026-09-28

おすすめの記事