以前の記事で大量のCSVファイルを結合したい場合の方法を紹介しましたが、その逆で長い間放置していたログファイル等が数GBの容量になり、急遽利用しなければならなくなった場合、Windowsのメモ帳とかEXCEL等では、ファイルサイズが大きすぎて開けなく困ったことはありませんか?
今回は、そんな巨大なファイルを簡単に適当なサイズに分割する方法を紹介します。
Windowsの標準機能を使って分割する
先ずは特別なツールを使わずに、Windows標準の機能のみを利用して簡単に分割処理をする方法を紹介します。実行サンプルとして以下のファイルを用意しました。
巨大なCSVファイル
ファイル名 :giga_data.csv
ファイルサイズ:約7GB
レコード数 :約3660万行
今回は、WindowsのPowerShellコマンドを利用して簡単にファイル分割をやってみよう思います。ちょっと複雑かもしれませんが以下のコマンドで実施します。
$i=1; Get-Content giga_data.csv -ReadCount 1000000 | % { Out-File giga_data_$i.csv -InputObject $_;$i++ }
コマンドは、分割元となるファイル名、分割指定行数(今回は100万行)、分割後のファイル名(1から分割数まで連番を付与)をそれぞれ指定します。コマンドを実行した結果が以下の通りです。
分割したファイル結果
分割ファイル数 :36ファイル
各ファイルサイズ:約330MB
分割時間 :約7分
実行環境 :Core i5 2.5GHz 8GB SSD
今回は100万レコードで分割していますが、ファイル数が増えますがもう少しレコード数を少なくして分割した方が、EXCELで扱うには重宝すると思います。
今回紹介した方法は、コマンド1つで目的を達成できるため、覚えておいて損はありません。複数のファイルを結合する方法とセットで覚えておくと色々な場面で役立つと思います。
初めまして。このツールを参考にしてみたのですが、↓の部分で引数が指定されていないとエラーが出ます。どう対処すればよいでしょうか?
-InputObject $_;i++ }
記事を見て頂きありがとうございます。
コマンドに一部、記述ミスがありました、申し訳ありません
正しくは、以下の通りです。
$i = 1
Get-Content giga_data.csv -ReadCount 1000000 | ForEach-Object {
Out-File -FilePath “giga_data_$i.csv” -InputObject $_
$i++
}
返信ありがとうございます。早速、修正頂いたコマンドで試してみましたが、記事の実行環境と同等スペックのPCかつ実行ファイルのサイズも半分以下ですが、1時間以上経っても終了しません。何かアドバイスいただけますでしょうか。
追記
自分で一部修正したら無事出来ました。後ろの部分、$_と$i++の間に;が必要なようです。ありがとうございました。
$i = 1
Get-Content giga_data.csv -ReadCount 1000000 | ForEach-Object {Out-File -FilePath “giga_data_$i.csv” -InputObject $_;$i++}