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

2024年3月17日日曜日

PowerShell

t f B! P L

アイキャッチ画像

この記事では、PowerShellを使って大容量のログファイルやCSVファイルを指定した行数ごとに分割する方法をわかりやすく解説します。

ログファイルやCSVなど、ファイルサイズが大きすぎるとテキストエディタで開けないことがあります。そのような場合、ファイルを小さく分割することで扱いやすくなります。Windows標準搭載のPowerShellを利用すれば、専用のツールをインストールする必要なく手軽にファイルを分割できます。

本記事では、PowerShellで「BOMあり/BOMなし」のUTF-8エンコーディングに対応したファイル分割の方法を詳しく紹介します。

ファイルを分割する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 <行数>を指定することで、1ファイルあたりの行数を設定します。

  • 分割後のファイル名
    Out-File "sub_$i.csv"のように指定します。$iは連番となるファイル番号を表します。

【応用編】UTF-8「BOM無し」でファイル分割する方法

PowerShellの標準設定では、-Encoding UTF8を指定すると、ファイルがBOM付き(先頭に3バイトの識別情報を持つ)になります。このBOMがあると、一部のソフトウェアで正しくファイルが読み取れないことがあります。

その場合には、BOM無しのUTF-8ファイルとして分割する必要があります。次のコードで対応可能です。

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でファイル分割する際の注意点

  • 分割したファイルのエンコーディング(BOMあり・なし)に注意しましょう。
  • Windows環境ではBOM付きUTF-8が一般的ですが、Linux環境や特定アプリケーションではBOM無しが求められることがあります。
  • BOMの有無でトラブルが起きる場合は、「BOM無しUTF-8」を選択しましょう。

まとめ

PowerShellを使えば、Windows標準機能だけで大容量ファイルを簡単に分割できます。 ファイルの分割が頻繁に必要な場合は専用ツールの導入も検討する価値がありますが、たまに行うだけであれば、Windowsに標準装備されているPowerShellで十分対応可能です。

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

このブログを検索

Profile

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

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

QooQ