search this site:

Chaotic Neutral

左にも右にもよらず、自由な生き方探し。

Windows Powershell ― 正規表現マッチ数


テキストをメモリーに読み込んで検索すると速い。テキストファイルにアニメ作品の各話ファイル名がいくつ含まれているのか調べるなら、次のようにやれば一瞬でわかります。

#全行読み込み
$text = type keys.txt
#カウンターリセット
$c = 0
#カウント
foreach($i in $text){
	if($i -match 'アニメ.*CLANNAD.*第..話'){
		$c++
	}
}
#結果表示
echo $c

ところが、keys.txtが25MBになると、配列$textの確保のために、メモリーが200MB程度も必要になることが分かりました。

keys.txtが80MBなら、多分、640MBくらいのメモリーを食うことになりそうです。

Shareで流れている鍵情報はテキスト保存すれば、30MB/分くらいです。これを、コマンドプロンプトで

type keys.txt | findstr /i /r /c:"アニメ.*第..話.*avi" > temp.txt
del keys.txt
ren temp.txt keys.txt
みたいに前処理しても、1週間もしないうちにkeys.txtは軽く100MBを超えそうです。

ファイルを配列変数に読み込むのは、現在の環境ではあきらめなければならないようです。

StreamReaderで1行ずつ読み込むことにしました。

#s1はファイル名、$s2は検索用の正規表現
function global:ck($s1, $s2){
	#パスが存在しなければ終了する
	if(!(Test-Path $s1)){return 'That path failed.'}
	#ファイルを読み込むのに使う文字コードを選択する
	#コマンドプロンプトで前処理済みなので、ここで選ぶのは"Shift-JIS"
	$e = [System.Text.Encoding]::GetEncoding("Shift-JIS")
	#ファイルを開いて、StreamReaderオブジェクトを作る
	#Resolve-Pathでファイル名をフルにする必要がある
	$sr = New-Object System.IO.StreamReader((Resolve-Path $s1), $e)
	#カウンターを初期化する
	$c = 0
	#マッチする行を数える
	while($l = $sr.readline()){
		if($l -match $s2){$c++}
	}
	#ファイルを閉じる
	$sr.close()
	#マッチ行数を返す
	return $c
}

コメントの投稿

URL
コメント
パスワード
秘密
管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://reviva.blog1.fc2.com/tb.php/1079-03a193d0