大容量のテキストファイル(ログ等)を、扱いやすいサイズやすぐに開けるサイズに分割したい時があり、方法を調べたので紹介したいと思います。
ちなみにLinuxではsplitコマンドを使用すれば簡単に実施できます。
WindowsではPowerShellを使用することでテキストファイルを行数指定で分割することができます。
テキストファイルを行数指定で分割する
PowerShellで、分割するテキストファイルが配置されているフォルダーに移動して、以下のように実行します。
$i=1; cat .\[分割対象ファイル] -ReadCount [分割行数] | % { $_ > [分割後ファイル名]_$i.txt;$i++ }
コマンド実行例)
PS C:\Users\Demo\Desktop\demo> $i=1; cat .\test.txt -ReadCount 3 | % { $_ > test_$i.txt;$i++ } PS C:\Users\Demo\Desktop\demo> dir ディレクトリ: C:\Users\Demo\Desktop\demo Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2020/06/20 23:07 2550 test.txt -a---- 2020/06/21 1:01 1022 test_1.txt -a---- 2020/06/21 1:01 1022 test_2.txt -a---- 2020/06/21 1:01 1022 test_3.txt -a---- 2020/06/21 1:01 1022 test_4.txt -a---- 2020/06/21 1:01 1022 test_5.txt PS C:\Users\Demo\Desktop\demo>
簡単にファイル分割できます。
PowerShellの使い方がよくわからないという方や、何回も分割することがある場合は次の方法も参考にしてください。
テキストファイルのファイル分割をドラッグ&ドロップで実行する
毎回コマンドで実行するのが面倒だという場合のために、スクリプトファイルを作ってみました。コマンドで実行する場合と異なりすごく長いですが、1度作成しておけば何度も使うことができます。コマンドを忘れてしまった時も問題ありません。
スクリプトファイルの作成
メモ帳等のテキストエディターに以下の内容をコピーし、拡張子は「.ps1」で保存してください。ファイル名は任意で問題ありません。
# アセンブリ読み込み Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing # 分割する行数のフォーム作成 $form = New-Object System.Windows.Forms.Form $form.Text = "分割行数" $form.Size = New-Object System.Drawing.Size(260,180) # OKボタンの設定 $OKButton = New-Object System.Windows.Forms.Button $OKButton.Location = New-Object System.Drawing.Point(40,100) $OKButton.Size = New-Object System.Drawing.Size(75,23) $OKButton.Text = "OK" $OKButton.DialogResult = "OK" # キャンセルボタンの設定 $CancelButton = New-Object System.Windows.Forms.Button $CancelButton.Location = New-Object System.Drawing.Point(130,100) $CancelButton.Size = New-Object System.Drawing.Size(75,23) $CancelButton.Text = "キャンセル" $CancelButton.DialogResult = "Cancel" # ラベルの設定 $label = New-Object System.Windows.Forms.Label $label.Location = New-Object System.Drawing.Point(10,30) $label.Size = New-Object System.Drawing.Size(250,20) $label.Text = "分割する行数を入力してください。" # 入力ボックスの設定 $textBox = New-Object System.Windows.Forms.TextBox $textBox.Location = New-Object System.Drawing.Point(10,70) $textBox.Size = New-Object System.Drawing.Size(225,50) # キーとボタンの関係 $form.AcceptButton = $OKButton $form.CancelButton = $CancelButton # ボタン等をフォームに追加 $form.Controls.Add($OKButton) $form.Controls.Add($CancelButton) $form.Controls.Add($label) $form.Controls.Add($textBox) #フォームを常に手前に表示 $form.Topmost = $True #フォームをアクティブにし、テキストボックスにフォーカスを設定 $form.Add_Shown({$textBox.Select()}) # 引数チェック if([string]::IsNullorEmpty($Args[0])) { [System.Windows.Forms.MessageBox]::Show("分割するファイルが指定されていません。", "分割ファイル指定エラー") exit } # ファイルの存在チェック if(-not(Test-Path $Args[0])){ [System.Windows.Forms.MessageBox]::Show("分割対象ファイルが存在しません", "ファイル指定エラー") exit } # フォームの表示 $result = $form.ShowDialog() if ($result -eq "OK") { $Line = $textBox.Text } else { exit } # 分割行数が数値か確認 if (-not([int]::TryParse($Line,[ref]$null))) { [System.Windows.Forms.MessageBox]::Show("数値以外の値が入っているため、処理を終了します。", "分割行数指定エラー") exit } # 分割後ファイル名指定用 $FileBaseName = [System.IO.Path]::GetFileNameWithoutExtension($Args[0]) $FileExtension = [System.IO.Path]::GetExtension($Args[0]) $FilePath = Split-Path -Parent $Args[0] $i=1 # ファイル分割 cat $Args[0] -ReadCount $Line | % { $_ > $FilePath\$FileBaseName"_"$i$FileExtension;$i++ }
スクリプトファイルの準備ができましたが、このままでは使い勝手が悪いためショートカットを用意します。「項目の場所を入力してください(リンク先)」を以下の内容でショートカットを作成してください。
powershell -ExecutionPolicy RemoteSigned -windowstyle hidden -File [作成したスクリプトファイルのフルパス]
ショートカットの作り方がわからない場合は以下の記事をご覧ください。
スクリプトファイルの使い方
スクリプトファイルを実行するには、作成したショートカットを使用します。ここではショートカットを「split」という名前で作成し、「test.txt」ファイルを分割する場合を例にして説明します。
- 分割したいテキストファイル「test.txt」をショートカット「split」にドラッグ&ドロップします。
- 「分割行数」画面が表示されるため、分割したい行数を入力し[OK]をクリックします。
- 元のフォルダーに「ファイル名_[連番]」の形でファイルが作成されます。
この形であれば、分割する行数が変わっても簡単に実行することができます。
その他のファイル分割
テキストファイルではなくバイナリファイルでもファイル分割は可能です。本ブログで紹介しているファイル分割方法をまとめているので気になる方はそちらもご覧ください。
コメント