2010年11月6日土曜日

◆テキストファイルの文字列を置換する

テキストファイルを読み込み特定の文字列を置換して更新する。
比較的よくあるパターンではないだろうか。
PowershellではReplace演算子を使って置換ができる。StringクラスのReplaceメソッドと違うのは、こちらは正規表現が使える事だろうか。

$filepath = "d:\desktop\test.txt"
Copy-Item "d:\desktop\test2.txt" "d:\desktop\test.txt"
Get-Content $filepath  | tee -Variable Giants
"--------------"
$Giants -replace "木村 正太","沢村 拓一" | tee -FilePath $filepath
"--------------"
Get-Content $filepath  | Set-Variable Giants
$Giants -replace "(\w*) (\w*)",'$2 $1' | tee -FilePath $filepath
"--------------"
$tempfile = [System.IO.Path]::GetTempFileName()
Get-Content $filepath | %{$_ -replace "^\d.*",'$0 選手' | Add-Content $tempfile}
del $filepath
Move-Item $tempfile  $filepath
Get-Content $filepath

結果はこんな感じ。

PS D:\Desktop> d:\Desktop\Giants.ps1
11 久保 裕也
13 高木 康成
15 木村 正太
17 東野 峻
19 土本 恭平
20 豊田 清
22 越智 大祐
26 内海 哲也
28 金刃 憲人
 
--------------
11 久保 裕也
13 高木 康成
15 沢村 拓一
17 東野 峻
19 土本 恭平
20 豊田 清
22 越智 大祐
26 内海 哲也
28 金刃 憲人
 
--------------
11 裕也 久保
13 康成 高木
15 拓一 沢村
17 峻 東野
19 恭平 土本
20 清 豊田
22 大祐 越智
26 哲也 内海
28 憲人 金刃
 
--------------
11 裕也 久保 選手
13 康成 高木 選手
15 拓一 沢村 選手
17 峻 東野 選手
19 恭平 土本 選手
20 清 豊田 選手
22 大祐 越智 選手
26 哲也 内海 選手
28 憲人 金刃 選手
 

まず、$Giants変数にテキストを読み込みReplace演算子で単純に置換した後、ファイルに書き戻している。
次に同変数に読み込みなおした後、今度は正規表現を使って姓と名を入れ替える。
それほど大きくないファイルの場合はこれで良いと思うが、大きなファイルの場合はその次のようにパイプ処理にて順次処理しながら一時ファイルに出力し最後にファイルを入れ替える。
ここでは単純に末尾に「選手」を付加している。

Tee-Objectコマンドレットは変数への設定やファイル出力と同時に画面にも表示してくれるコマンド。
正規表現の詳細についてはどこか詳しいサイトを参照してほしい。

0 件のコメント:

コメントを投稿