Bom付きUTF8改行コードCRLFを、Bom無しUTF8改行コードLFに変更
PowershellではUTF8を扱うことができるが、
それはBOM付きになってしまい、また、
改行コードはCRLF
になってしまう。
Excelでcsvファイルを作成するときにも
BOM付きUTF8、CRLFになってしまうため、
PowershellからC#のクラスを呼んで変更しているサイトが
多いが、
Mac、UbuntuなどWindows以外のOSで実行できないため、
シェルスクリプトだけで解決してみる。
実はあまり、知られていないかもしれないが、
Get-Contentでは、バイト単位で読むことができる。
Get-Conttent -Encoding Byteとするとバイト単位で配列を作成する。
1バイトにつき一つの要素である。
Bomはファイルの最初の3バイトなので、
インデックス番号が3以降のものだけ取得する。
「UTF-8Bom付きCRLF」ファイルから
「UTF-8BOM無しLF」ファイルを簡単に作成できる。
それはBOM付きになってしまい、また、
改行コードはCRLF
になってしまう。
Excelでcsvファイルを作成するときにも
BOM付きUTF8、CRLFになってしまうため、
改行についてはbashなら、
nkfコマンドで変更するとよいが、
wsl版のbashにはaptを見ても、
nkfがない。
PowershellからC#のクラスを呼んで変更しているサイトが
多いが、
Mac、UbuntuなどWindows以外のOSで実行できないため、
シェルスクリプトだけで解決してみる。
実はあまり、知られていないかもしれないが、
Get-Contentでは、バイト単位で読むことができる。
Get-Conttent -Encoding Byteとするとバイト単位で配列を作成する。
1バイトにつき一つの要素である。
Bomはファイルの最初の3バイトなので、
インデックス番号が3以降のものだけ取得する。
また、Set-Contentもバイト単位で書き込むことができる。
これを利用して「UTF-8Bom付きCRLF」ファイルから
「UTF-8BOM無しLF」ファイルを簡単に作成できる。
#Select-Object -skipで最初の3文字だけ読み飛ばすという方法だと
#Bom無しのUTF8に実行したとき実際の内容まで消してしまうので、
#下のように直接指定する。
$bom = @(239,187,191)
$content = Get-Content .\lesson.txt -Encoding Byte
if($content[0] -eq $bom[0] -and $content[1] -eq $bom[1] -and $content[2] -eq $bom[2])
{
$content[0] = $null
$content[1] = $null
$content[2] = $null
}
$content | Set-Content -Path result.txt -Encoding Byte
$content = Get-Content result.txt
Set-Content (($content -join "`n") + "`n") -Path result.txt -NoNewline
実際使うときには
BOMを消す部分と、
改行文字を直す部分を
別々のコマンドレットとして作成すること。
注意点としては
BOMを消す部分と、
改行文字を直す部分を
別々のコマンドレットとして作成すること。
注意点としては
1バイトずつ配列に入れるので、
長いテキストファイルだと、
配列の長さの上限に達する可能性があることである。
配列の長さが気になる場合はあらかじめ
Get-Contentで行数を数えておいて、
行区切りで
行区切りで
いくつかのファイルに分割して行えばよい。
コメント
コメントを投稿