文字列の置換処理

シゴトでとあるファイル中の文字を置換する必要があったのですが、テキストエディタでファイルの最後まで自動的に置換処理をさせようとすると、CPU使用率100%状態が長時間続くため中止しました。
代わりにExcelVBAでファイルを読み込み、置換させてやると大して負荷かかることもなく一瞬で終わりました。
対象のファイルの行数が5万行もあり、容量が大きかったからなのかもしれませんが…
負荷の違いは画面描画の有無の違いなのかしら。
他のことに使っていたExcelVBAがそのまま流用できたのですごく楽できました。
以下は置換に使ったMS Excelのコード。
他のことにも流用できると思うので覚え書き。
追記:2007-07-16 12:55:53 JST
トローンさんに教えてもらったけどPerlを使った方がスクリプト自体は簡単なものになりますね。
VBAだとムダな改行とコメントを入れて100行近くになったけど、Perlだとわずか10行程度で同じ処理をできる模様。
トローンさんに教えてもらった文そのまま下の方に追記しました。

ExcelVBA
     ThisWorkbook内

Option Explicit
Public Sub tikan()
‘———- 変数の宣言 ———-
Dim j As Integer ‘開始行
Dim strLPass, strSPass As String
Dim strLName, strSName As String
‘L:ロード  S:セーブ
Dim iLRowSt, iLRowEd As Variant
‘CSVファイル中抽出開始行,終了行
Dim fs, fsLoad, fsSave As Object           ‘FSO用
Dim strLine As String                                ‘読み込んだ文字列

‘———- 変数の宣言 End ———-

‘———– 編集ここから ———–

iLRowSt = 1                    ‘処理開始行
iLRowEd = 831              ‘処理終了行
‘3万行ほどまでしか一度に処理できないので注意
‘終了行は+1で書くこと
‘読み込むパスとファイル名(パス末尾に必ず\つける)
strLPass = "C:\"
strLName = "2007-07-16.log"
‘書き込むパスとファイル名(パス末尾に必ず\つける)
strSPass = "C:\"
strSName = "2007-07-16_re.csv"
‘まだ下に置換文字列の設定箇所がある
‘———– 編集ここまで ———–

‘———– 処理ここから ———–
Set fs = CreateObject("Scripting.FileSystemObject")
‘OpenTextFile(ファイル名,モード(1:読取専,2:上書き,8:追記))
‘読み取り専用モードでファイルを開く
Set fsLoad = fs.OpenTextFile _
(strLPass & strLName, 1)
‘上書きモードで保存用CSVファイルを開く(作成)
Set fsSave = fs.OpenTextFile _
(strSPass & strSName, 2, True)
j = 1 ‘開始行
‘1行分読み込む
strLine = fsLoad.ReadLine
‘読み込んだ行がファイルの末尾になるまで以後の処理を繰り返す
Do Until fsLoad.AtEndOfLine = True
‘抽出開始行以降ならば抽出する
If j >= iLRowSt Then

‘———– 編集ここから ———–
‘無駄な半角スペースを除去
strLine = Replace(strLine, " ", "")
strLine = Replace(strLine, ":00, 2", ":00’,2")
strLine = Replace(strLine, " ", "")
strLine = Replace(strLine, "/ ", "/")
strLine = Replace(strLine, ", ", ",")
strLine = Replace(strLine, "2007", "’2007")
‘———– 編集ここまで ———–

‘抽出した行を別ファイルに保存
fsSave.WriteLine strLine
End If
‘抽出終了行になったら処理を中断する
If j >= iLRowEd Then Exit Do
j = j + 1
strLine = fsLoad.ReadLine
Loop
‘CSVファイルを閉じる
fsLoad.Close
fsSave.Close
End Sub

Perl

my $file = shift;
open(IN, $file) or die "Can’t open $file: $!\n";
while(<in>){
s/hoge/HOGE/g;
s/foo/bar/g;
#(このへん、置換処理をずらずらと書く)
print;
}
close(IN);

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください