ToCharArray で文字列を配列に [PowerShell]
テキスト中の、いわゆる全角英数文字を半角英数文字に変換するフィルタを試しに書いてみました。
入力チェックとか何もない手抜きですが、とりあえず動きます。
入力はパイプラインから与えることを想定しています。
たとえば、どこがとりあえずかというと、
このままだと出力の文字コードがUTF16固定になってしまいます。
そこで、使うときには Out-File の Encoding 指定を使います。たとえば、
でもこれだとなんとなく for のあたりが PowerShell っぽくありません。
いかにもCとかC++プログラマが書いた感じです。
Length で長さを明示的に取るあたりが無駄な気がします。
ToCharArray をつかって入力の文字列を文字の配列にばらして処理してみましょう。
まだ、無駄がある気がします。
foreachをつかわずそのままパイプに流せそうな。。。
ずいぶん、すっきりした気がします。
最初からこういうように書けるようになりたいものです。
ちなみに、実行速度はどれが早いか比較していません。(^_^;
どうなんだろう。。
process {
$ol=""
for ($ix=0; $ix -lt $_.Length; $ix++)
{
$cc=[int]($_[$ix])
if ($cc -ge 0xFEE0) { $cc -= 0xFEE0 }
$ol += [char]$cc
}
$ol
}
入力チェックとか何もない手抜きですが、とりあえず動きます。
入力はパイプラインから与えることを想定しています。
たとえば、どこがとりあえずかというと、
このままだと出力の文字コードがUTF16固定になってしまいます。
そこで、使うときには Out-File の Encoding 指定を使います。たとえば、
Get-Content .\sample.txt | .\Convert-Z2A-.ps1 | Out-File -Encoding OEM
でもこれだとなんとなく for のあたりが PowerShell っぽくありません。
いかにもCとかC++プログラマが書いた感じです。
Length で長さを明示的に取るあたりが無駄な気がします。
ToCharArray をつかって入力の文字列を文字の配列にばらして処理してみましょう。
process {
$o = ""
foreach ($c in $_.ToCharArray()) {
if ($c -ge '!') { $c = [char]($c-0xFEE0) }
$o += $c
}
$o
}
まだ、無駄がある気がします。
foreachをつかわずそのままパイプに流せそうな。。。
process {
$o = ""
$_.ToCharArray() | % { if ($_ -ge '!') { $_ = [char]($_-0xFEE0) }; $o += $_ }
$o
}
ずいぶん、すっきりした気がします。
最初からこういうように書けるようになりたいものです。
ちなみに、実行速度はどれが早いか比較していません。(^_^;
どうなんだろう。。