【Windows】巨大CSVを分割するPowerShell/バッチファイル

行数の多い巨大CSVを直接WordPressにインポートしようとすると
途中で失敗したり、サーバーの処理がタイムアウトするといった問題に遭遇することがあります。

WordPressのエクスポートCSVは、記事数が多いと数万行~数十万行になることもあり、
そのままインポートするとサーバー負荷が高くなってしまいます。

そこで、CSVファイルを行数単位で自動分割するツールを作りました。

作ったツール

今回作ったツールは次の2種類です。

SplitCSV.bat(バッチファイル)
SplitCSV.ps1(PowerShellファイル)

どちらも同じフォルダに設置し、
分割したいCSVをバッチファイルにドラッグ&ドロップします。

分割した各CSVにヘッダー行を保持し、大きなCSVでも設定した任意の行数で自動分割する
というシンプルなツールです。

バッチファイルからPowerShellファイルを呼び出すという形にし、Windows環境ならすぐ使えるようにしています。

コードと使い方

以下のコードをコピー&ペーストで、それぞれSplitCSV.batSplitCSV.ps1として保存します。
SplitCSV.batに分割したいCSVファイルをドラッグ&ドロップすると「同じファイル名+連番」というカタチで分割されたCSVが自動生成されます。

SplitCSV.bat

@echo off

if "%~1"=="" (
 echo CSVをドラッグ&ドロップしてください
 pause
 exit
)

powershell -ExecutionPolicy Bypass -File "%~dp0SplitCSV.ps1" "%~1"

pause

SplitCSV.ps1

param(
    [string]$file
)

$name = [System.IO.Path]::GetFileNameWithoutExtension($file)
$dir  = Split-Path $file

$header = Get-Content $file -Encoding utf8 | Select-Object -First 1
$data = Import-Csv $file -Encoding utf8

$i = 1
$chunk = @()

foreach ($row in $data) {

    $chunk += $row

    if ($chunk.Count -eq 500) {

        $out = Join-Path $dir ($name + "_" + $i + ".csv")

        $header | Out-File $out -Encoding utf8
        $chunk | Export-Csv $out -Append -NoTypeInformation -Encoding utf8

        $chunk = @()
        $i++
    }
}

if ($chunk.Count -gt 0) {

    $out = Join-Path $dir ($name + "_" + $i + ".csv")

    $header | Out-File $out -Encoding utf8
    $chunk | Export-Csv $out -Append -NoTypeInformation -Encoding utf8
}

まとめ

巨大CSVを扱うときは、
「分割して処理する」
だけでかなりトラブルを減らすことができます。

今回紹介した

SplitCSV.bat
SplitCSV.ps1

は、シンプルですが実用性の高いツールです。
CSVを扱う機会が多い方は、ぜひ活用してみてください。

複数CSVをひとつにまとめる方法

https://www.uki213.com/memo/how-to-merge-csv-files-with-batch-script/

参考: https://musashino-blog.com/ps_script2/

関連記事

コメントを残す

*