ログファイルなどの強大なテキストファイルを簡単に分割する方法。Get-Contentコマンドに-ReadCountパラメーターを組み合わせて使うと行数単位で、簡単に分割することができる。 メモ帳で以下のようなファイルを作成して保存してある。
> Get-ChildItem -name text.txt > Get-Content .\text.txt 1 2 3 4 5 6 7 8 9 10
このファイルを4行ずつに分けて保存をする。ファイル名はtext_XX.txt(XXは01,02,03,…と連番)とする。以下の1行を入力する。
> $i = 1; cat .\text.txt -ReadCount 4 | % {$_ > $i.ToString("text_00\.txt"); $i++}
長くなるためエイリアスを使用している(Get-Content → cat、ForEach-Object → %)。 きちんと分割されているか否か、確認。
> Get-ChildItem -name text.txt text_01.txt text_02.txt text_03.txt > Get-Content .\text_01.txt 1 2 3 4 > Get-Content .\text_03.txt 9 10
分割元と分割されたファイルをダンプしてみる。
> Format-Hex .\text.txt 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00000000 31 0D 0A 32 0D 0A 33 0D 0A 34 0D 0A 35 0D 0A 36 1..2..3..4..5..6 00000010 0D 0A 37 0D 0A 38 0D 0A 39 0D 0A 31 30 0D 0A ..7..8..9..10.. > Format-Hex .\text_01.txt 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00000000 FF FE 31 00 0D 00 0A 00 32 00 0D 00 0A 00 33 00 ..1.....2.....3. 00000010 0D 00 0A 00 34 00 0D 00 0A 00 ....4.....
Windows 10のメモ帳は文字コードはUTF-8で保存される。PowerShellのリダイレクトは、文字コードはUTF-16で行われる。ファイルの1バイト目がFF、2バイト目がFEであり、これはバイトオーダーマーク(BOM)で、UTF-16のリトルエンディアンであることがわかる。UTF-16の1文字は2バイトで、リトルエンディアンのため下位バイトから保存されるが、そのようになっていることがわかる。