【PowerShell】巨大ログファイルをN万行ごとに分割するスクリプト
概要
巨大なログファイルをエディターで開いたところ、動作が極端に重くなった。
そこで、ファイルを一定行数ごとに分割して保存する簡易スクリプトをPowerShellで作成しました。
このスクリプトを使うと、数百万行クラスのCSVやログでも、複数ファイルに分けて軽快に閲覧・処理できます!
スクリプト
code:ファイル分割スクリプト.ps1
# =========================================
# PowerShell ファイル分割スクリプト
# -----------------------------------------
# ・指定したテキストファイルをN行ごとに分割します
# ・例: .\Split-File.ps1 "C:\data\sample.csv"
# =========================================
# 実行ポリシーのエラーが出た場合は、以下を実行して一時的に回避
# Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
# 引数で指定されたファイルを取得
if (-not $inputFilePath) {
Write-Host "❌ ファイルを指定してください。" -ForegroundColor Red
exit
}
# 分割単位(1ファイルあたりの行数)
$linesPerFile = 50000
# 入力ファイル情報を分解
$inputFileName = System.IO.Path::GetFileNameWithoutExtension($inputFilePath) # 出力ディレクトリ作成(存在しない場合のみ)
$outputDir = Join-Path $inputDir $inputFileName
if (-not (Test-Path $outputDir)) {
New-Item -ItemType Directory -Path $outputDir | Out-Null
}
# 読み込み・書き出し処理
$counter = 0
$fileNumber = 1
$writer = $null
try {
while ($null -ne ($line = $reader.ReadLine())) {
if ($counter % $linesPerFile -eq 0) {
if ($writer) { $writer.Close() }
$outputFileName = "output_$fileNumber"
$outputFile = Join-Path $outputDir ($outputFileName + $inputFileExtension)
$fileNumber++
}
$writer.WriteLine($line)
$counter++
}
}
finally {
$reader.Close()
if ($writer) { $writer.Close() }
}
Write-Host "✅ 分割処理が完了しました。" -ForegroundColor Green
使いかた
1. スクリプトを任意の場所に保存します(例:Split-File.ps1)。
2. PowerShellを開き、以下のように実行します。
code:open.bash
.\Split-File.ps1 "C:\logs\access.log"
3. スクリプトは、入力ファイルと同じフォルダに 同名のサブフォルダ を自動生成し、その中に output_1.log, output_2.log, ... のような分割ファイルを作成します。
4. 1ファイルあたりの行数は、スクリプト内の $linesPerFile 変数で調整可能です。
備考
スクリプト実行時に「スクリプトの実行が無効になっている」と表示された場合は、以下のコマンドを実行して一時的に回避できます。
code:ExecutionPolicy.bash
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
出力先フォルダに既存ファイルがある場合は上書きされるため、必要に応じてバックアップを取ってください。
改行コード・文字コードは元ファイルと同じはず。
行数指定を増やしすぎると再びエディターが重くなるため、分割単位はファイルサイズに応じて調整してください。