Muni Bus

パソコンの操作方法や設定方法を忘れないようにメモしています。ブログを一回引っ越ししているので、所々表示がかなり乱れています・・・

【PowerShell】テキストファイルを自動で分割する

ログファイルなどの強大なテキストファイルを簡単に分割する方法。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バイトで、リトルエンディアンのため下位バイトから保存されるが、そのようになっていることがわかる。