スポンサーサイト

--年--月--日 --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

LotusScript: ファイルにある特定の文字列を置換するサンプル

2011年05月23日 01:45

今日は久しぶりにサンプルでも書いてみようかと思います。LotusScriptでファイルの編集をしようと思うと結構大変ですよね。このTechnoteではCSVを扱うサンプルを紹介していますが、テキストファイルを読み込むだけなのであまり複雑な処理はしていません。

LotusScript ではテキストファイルを開いたり書き込んだりすることが出来ますが、「読み込んだファイルの途中にある値を挿入したり、特定の行を削除する」と言う方法がちゃんと用意されていないのでファイルが扱いにくいのです。ヘルプにあるファイルを処理する例もあるファイルを読み込んで別のファイルに書き出す、と言うもので、開いたファイルを編集するようなものではありません。

実際編集が必要な場合はどうしているでしょうか?

とりあえず私はファイルを読み込んで適切な内容の一時ファイルを生成する⇒元のファイルを消して一時ファイルをリネームする と言う原始的な方法でサンプルを書いてみました。なんか納得がいかないですよね。。

今日のサンプルでは、ここで紹介したスタンダード版の設定で<プログラムディレクトリ>\framework\rcp\plugin_customization.ini を書き換えると言うのがどうも煩雑なので設定ボタンを作ろうと思って作ったものです。
プログラムディレクトリの取得はここで使ったやつを流用しました。

実はVBSで似たような処理を書いたこともあるのですが、その時もいい方法が分からなくて、結局同じような方法で対応していたのでこうするしかないのかもしれません。。。

まとまりのない記事になってしまいましたが、是非優秀な開発者の方がもっと教育的なコードをどこかで紹介してもらうためのたたき台にでもなればなあ・・・・と思います。

注: ファイル処理の関係上、元のファイル名 + .tmpと言う一時ファイルを生成しています。同名のファイルがあった場合はちゃんとハンドルしていません。。

Sub Click(Source As Button)
Dim ses As New NotesSession
Dim datadir, configfile As String
ProgDir = GetProgramDir()
configfile = ProgDir & "framework\rcp\plugin_customization.ini "

' com.ibm.notes.branding/enable.update.ui が見つかったらcom.ibm.notes.branding/enable.update.ui=true にする
' 見つからなかったらcom.ibm.notes.branding/enable.update.ui=true をそのまま追加

Call ReplaceEntryInTXT(configfile,"com.ibm.notes.branding/enable.update.ui","com.ibm.notes.branding/enable.update.ui=true")
End Sub
Sub ReplaceEntryInTXT(filepath As String, SrcStr As String, RepStr As String)
' この関数はテキストファイルをスキャンして、SrcStrで指定した文字列が見つかったらその行を RepStr で置き換えます
'またエントリが存在しなかった場合、最後にRepStr のエントリを加えます。
' RepStrが空文字("")の場合、その行は削除されます。


Dim find As Boolean
Dim tmpfile,txt As String
tmpfile = filepath & ".tmp"
find = False
filenum = Freefile()
Open filepath For Input As filenum
filenum2 = Freefile()
Open tmpfile For Output As filenum2

While Not Eof(filenum)
Line Input #filenum , txt
If (Instr(Lcase(txt), Lcase(SrcStr)) > 0) Then
If Not (RepStr="") Then
Print #filenum2, RepStr
End If
Find = True
Else
Print #filenum2, txt
End If
Wend

If (find = False) Then
If Not (RepStr="") Then
Print #filenum2, RepStr
End If
End If

Close filenum
Close filenum2

Kill filepath
Filecopy tmpfile, filepath
Kill tmpfile
End Sub
Function GetProgramDir() As String
GetProgramDir = ""
Set objWshShell = CreateObject("WScript.Shell")
strValue = objWshShell.RegRead("HKLM\SOFTWARE\Lotus\Notes\Path")

If Right(strValue,1) <> "\" Then
strValue = strValue & "\"
End If

GetProgramDir = strValue
End Function






コメント

    コメントの投稿

    (コメント編集・削除に必要)
    (管理者にだけ表示を許可する)

    トラックバック

    この記事のトラックバックURL
    http://hnagasim.blog8.fc2.com/tb.php/390-60c6a92b
    この記事へのトラックバック


    最新記事


    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。