【PowerShell】BOMなしでUTF-8のCSVファイルを分割する

PowerShell Windows

初めに

ヒートランテストのために、文字コードUTF-8で作成したCSVのテストデータを分割して投入する必要がありました。
会社PCのデフォルト環境(ソフトウェアインストールなし)でそれを実現しなければならなかったため、PowerShellでスクリプトを作成しました。

ただし、会社PCのPowerShellはバージョンが5.1であり、-Encoding utf8NoBOMが使えず、単にUTF-8で書き込みをすると、BOMありとなってしまい、システムに投入できませんでした。
PowerShellバージョン5.1でも、BOMなしのUTF-8でファイルを書き込むようにスクリプトを作成したため、下記にて紹介します。

BOMなしでUTF-8のCSVファイルを分割するスクリプト

前提

PowerShellのバージョンは「5.1」です。

スクリプト

# 元のファイルパス
$filePath = "★分割元のファイルパス★"
# 分割する行数
$line = 100
# 分割されたファイルカウンターの初期値
$fileCounter = 1

# 元のファイルを読み込む
$content = Get-Content $filePath -Encoding UTF8

# ヘッダ行を抽出
$header = $content[0]

# ファイルを分割して保存
for ($i = 1; $i -lt $content.count; $i += $line) {
    $lines = $content[$i..($i + $line -1)] # ヘッダ行を除くため、-1
    # 保存するファイルパス
    $newFilePath = $filePath.Substring(0, $filePath.LastIndexOf('.')) + "_" + $fileCounter
    # ヘッダ行含め、ファイルに書き込む
    $header, $lines | Out-File $newFilePath -Encoding utf8

    # BOMなしで書き込む
    Get-Content -Path $newFilePath -Raw -Encoding Default `
    | % { [Text.encoding]::UTF8.GetBytes($_) } `
    | Set-Content -Path "$newFilePath.csv" -Encoding Byte

    # BOMありのファイルを削除
    Remove-Item $newFilePath -Force

    # ファイルカウンタを増やす
    $fileCounter++
}

動作仕様

指定した分割元のCSVファイルを、指定した行数分でファイルを分割します。
文字コードはBOMなしのUTF-8です。

元のファイル名がtest.csvであれば、分割後のファイル名はtest_1.csv,test_2.csv…のように連番を振って、アンダーバーで結合した形にしています。

最後に

とりあえず、100個くらいに分割したかったため、あまり深く考えずに作成しました。
分割数分書き込み、削除を繰り返していくのでもっと大量にファイルを分割したい場合は、性能的にロジックを見直す必要はあると思います。

コメント