こんにちは、窪田です。
テキストファイルを開く際に、ファイルサイズが大きすぎて、開けないという状況に陥ったことはないでしょうか。
今回はそんな時の対処法として、テキストファイルを分割する方法を紹介したいと思います。
目次
実行するスクリプト
分割したいファイルをC:\Users\ユーザー下に置き、Windows PowerShellで下記のコマンドを実行してください。
$utf8n = New-Object System.Text.UTF8Encoding $False; $path = 'C:\Users\ユーザー名\'; $i = 1; Get-Content "$path\test.txt" -ReadCount 10 | % {[System.IO.File]::WriteAllLines("$path\test_$i.txt", $_, $utf8n); $i++}
※ファイル名やファイルのパスを適宜変更し、実行してください。
'C:\Users\ユーザー名\'が分割するファイルが置かれているフォルダ
\test.txtが分割するファイル
-ReadCount 10が分割する行数
\test_$i.txtが分割後のファイル名
分割したいファイルがある状態で...
スクリプトを実行すると...
ファイルが分割できました。
コマンドの解説
$utf8n = New-Object System.Text.UTF8Encoding $False;
まず最初に分割後ファイルの文字コードをUTF-8Nに設定しています。
厳密に言うと、UTF-8Nのインスタンスを作成し、変数に格納しています。
$path = 'C:\Users\ユーザー名\';
ここでは、分割するファイルと分割後のファイルが出力されるフォルダのパスを設定しています。
$i = 1;
ここでファイル名に使用する変数を定義しています。
今回の場合は、初期値が1なのでtest_1.txtになります。
Get-Content "$path\test.txt" -ReadCount 10
Get-Content ファイルのパスで、指定したファイルの中身を取得できます。
-ReadCount 数字で、パイプラインによって渡す結果の行数を指定しています。
| % {[System.IO.File]::WriteAllLines("$path\test_$i.txt", $_, $utf8n); $i++}
|(パイプライン)によって、前に実行したコマンドの結果を取得できます。
%は、パイプラインを介して渡された結果を繰り返し処理するForEach-Objectコマンドの省略した書き方です。
% {}で波括弧の中の処理を繰り返し実行します。
[System.IO.File]::WriteAllLines("$path\test_$i.txt", $_, $utf8n)
WriteAllLines()で、新しいファイルを作成し、そのファイルに文字列を書き込みます。
$_はパイプラインを介して渡された結果を意味するので、$path\test_$i.txtのファイル名を作成し、Get-Contentコマンドの結果で得られた10行を、UTF-8Nの文字コードで書き込みます。
$i++
最後に++(インクリメント演算子)で、$iの変数に1を加算します。
これにより、test_$i.txtの部分がtest_1.txt、test_2.txt...となり、連番のファイルが作成されます。
まとめ
今回は、Windows PowerShellでテキストファイルを分割する方法をご紹介しました。
仕事中、サイズの大きいログファイルを確認したい時があるので、自分が忘れないためにもブログに書き留めておきました。
ファイルサイズが大きすぎてテキストファイルが開けなくなった際には、Windows PowerShellを活用してみてください。