ログやCSVファイルなどをテキストエディタで開くとき、あまりに行数が多いと開ないことがあり、ファイルを分割して1つ1つのファイルサイズを縮めることがあります。
この記事では、PowerShellを使って、指定した行数でファイルを分割する方法を紹介します。わざわざツールをインストールしなくても、Windows標準のPowerShellで分割できるのは、非常にありがたいです。
スポンサーリンク
ファイルを分割するPowerShell
今回は、ALL.csv
という名前のCSVファイルを、500行ごとに分割してsub_0.csv
、 sub_1.csv
…という感じでファイルを作成する例のコードを紹介します。
$i=0; Get-Content ALL.csv -ReadCount 500 | % {$_ | Out-File "sub_$i.csv" -Encoding UTF8 -Append; $i++}
上のコードのポイントは3つです。
- 分割元のファイルは
Get-Content <ファイル名>
で指定します。 - 分割する行数は
-ReadCount <行数>
の部分で指定します。 - 分割先のファイル名は
Out-File "ファイル名_$i.csv"
のような感じで指定。($i
には分割されたファイルの連番が入る)
UTF-8 BOM無しでファイル分割する
PowerShellでは、文字コードを指定する-Encoding
オプションに「UTF-8」を指定すると、デフォルトでBOM付きUTF-8のファイルとして出力されます。
つまり「UTF-8」でファイルを分割すると、各ファイルの先頭に「UTF-8」であることを示す3バイトのバイトシーケンス<0xEF 0xBB 0xBF>が書き込まれるため、ファイルを読み込むツールによっては、先頭3バイトのデータが邪魔をして正しくファイルが読み取られないことがあります。
もし、BOM無しの「UTF-8」でファイルを分割する場合は、少しコードが長くなりますが、次のようなスクリプトを書きます。
# BOM無しのUTF-8エンコーディングを作成
$UTF8woBOM = New-Object "System.Text.UTF8Encoding" -ArgumentList @($false)
# ファイルを分割(上で作成したBOM無しのUTF-8エンコーディングを指定)
$i=0; Get-Content ALL.csv -ReadCount 500 | % {[System.IO.File]::WriteAllLines("sub_$i.csv", $_, $UTF8woBOM); $i++}
スポンサーリンク
まとめ
PowerShellで指定した行数でファイルを分割する方法を解説してきました。
頻繁にファイルを分割するケースが発生する場合は、専用のツールを入れた方がよいかもしれませんが、たまに分割する程度であれば、Windowsに標準で入っているPowerShellで十分ですね。
0 件のコメント:
コメントを投稿