ファイルを指定行数で分割するPowerShell

2021年7月28日水曜日

PowerShell

t f B! P L

ログやCSVファイルなどをテキストエディタで開くとき、あまりに行数が多いと開ないことがあり、ファイルを分割して1つ1つのファイルサイズを縮めることがあります。

この記事では、PowerShellを使って、指定した行数でファイルを分割する方法を紹介します。わざわざツールをインストールしなくても、Windows標準のPowerShellで分割できるのは、非常にありがたいです。

スポンサーリンク

ファイルを分割するPowerShell

今回は、ALL.csvという名前のCSVファイルを、500行ごとに分割してsub_0.csvsub_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で十分ですね。

スポンサーリンク

QooQ