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

2024年3月17日日曜日

PowerShell

t f B! P L

この記事では、PowerShellを使用してファイルを指定した行数で分割する方法について説明します。
大容量のログファイルやCSVファイルを扱う際には、ファイルのサイズが大きすぎてテキストエディタで開けない場合があります。このような時、ファイルを小さなサイズの複数のファイルに分割することが有効です。
PowerShellはWindows標準の機能です。そのため、追加のツールをインストールすることなくファイルを分割することができます。

スポンサーリンク

ファイルを分割する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で十分対応可能です。

スポンサーリンク
スポンサーリンク

このブログを検索

Profile

自分の写真
Webアプリエンジニア。 日々新しい技術を追い求めてブログでアウトプットしています。
プロフィール画像は、猫村ゆゆこ様に書いてもらいました。

仕事募集もしていたり、していなかったり。

QooQ