行数の多い巨大CSVを直接WordPressにインポートしようとすると
途中で失敗したり、サーバーの処理がタイムアウトするといった問題に遭遇することがあります。
WordPressのエクスポートCSVは、記事数が多いと数万行~数十万行になることもあり、
そのままインポートするとサーバー負荷が高くなってしまいます。
そこで、CSVファイルを行数単位で自動分割するツールを作りました。
作ったツール
今回作ったツールは次の2種類です。
SplitCSV.bat(バッチファイル)
SplitCSV.ps1(PowerShellファイル)
どちらも同じフォルダに設置し、
分割したいCSVをバッチファイルにドラッグ&ドロップします。
分割した各CSVにヘッダー行を保持し、大きなCSVでも設定した任意の行数で自動分割する
というシンプルなツールです。
バッチファイルからPowerShellファイルを呼び出すという形にし、Windows環境ならすぐ使えるようにしています。
コードと使い方
以下のコードをコピー&ペーストで、それぞれSplitCSV.batとSplitCSV.ps1として保存します。
SplitCSV.batに分割したいCSVファイルをドラッグ&ドロップすると「同じファイル名+連番」というカタチで分割されたCSVが自動生成されます。
SplitCSV.bat
@echo off
if "%~1"=="" (
echo CSVをドラッグ&ドロップしてください
pause
exit
)
powershell -ExecutionPolicy Bypass -File "%~dp0SplitCSV.ps1" "%~1"
pauseSplitCSV.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.batSplitCSV.ps1
は、シンプルですが実用性の高いツールです。
CSVを扱う機会が多い方は、ぜひ活用してみてください。
複数CSVをひとつにまとめる方法
https://www.uki213.com/memo/how-to-merge-csv-files-with-batch-script/
参考: https://musashino-blog.com/ps_script2/