2015年2月4日水曜日

◆文字の出現回数を調べる

とりあえず文字コードはユニコードが前提。

特殊文字、たとえばタブなどを検索する場合は、
$findChar = “`t”
として指定する。

001
002
003
004
005
006

$findChar = "探"
$inputFile = "d:\Desktop\uniTest.txt"

$findCharCD = [int][char]
$findChar
$text
=[System.IO.File]::ReadAllText($inputFile
)
@(
[int[]][char[]]$text -eq $findCharCD).Count

--- 20150209 追記 ---

この記事が結構見られているようなので別の方法を補足。

ネットを見てみると、検索文字列を空文字に置き換えて、減った長さから文字数をカウントするという方法が多く使われているようだ。

なので、一応その方法も記載しておく。
この方法だと単語での検索もできるのでベターかも。(速さ的にもこちらが速そう)

001
002
003
004
005
006

$findChar = "探す"
$inputFile = "d:\Desktop\uniTest.txt"

$text=[System.IO.File]::ReadAllText($inputFile
)
(
$text.Length -
 
 
$text.Replace($findChar,"").Length)/$findChar.Length

SJISファイルの場合は、ReadAllTextに文字コードを指定する。
ReadAllText($inputFile,[System.Text.Encoding]::GetEncoding("shift_jis"))
といった感じだろうか。

--- 20150323 追記 ---

ついでに、正規表現を使う場合はRegexクラスを使うか、PowerShellのReplace演算子を使う。

ここではReplace演算子に書き換えてみる。

001
002
003
004
005
006

$findChar = "\w探す"
$inputFile = "d:\Desktop\uniTest.txt"

$text=[System.IO.File]::ReadAllText($inputFile
)
(
$text.Length -
 
  (
$text -replace $findChar,"").Length)/3

findCharの長さは汎用的には求められないと思うのでここでは固定値で指定した。
検索する文字列長が可変の場合は今回の方式では辛くなるので、地道に先頭からなめて行くしか無いのかな・・・。