ファイル内のある特定な文字列を置換したいのですが、
いい方法が見つかりません。
現在、AファイルをOpenし、一行づつ読み込んで、一行づつ検索し、
見つかった特定の文字列があれば、Mid関数等で置換を実施し、
その後Bファイルを書き込み用にOpenし、読み込んだ行、
及び置換した文字列を含む行を書き込んでいく方法を取っています。
この方法以外に上手い方法はないでしょうか?
VB6なら「Mid関数等で置換を実施」を Split で行えます。
Webで検索すればVB5にても同様の事が出来るような
サンプルが見つかると思います。
他の部分はシーケンシャルファイルである以上は
やむを得ない手順と思います。
少し荒業ですが私なら
RichTextBoxを一つ隠しで置き
RichTextBoxにLoadFileで全てファイルを読み込んで
Replace関数で一発置換し
SaveFileで一回で書き込みます。
3行で終わります。
'================================
RichTextBox1.LoadFile (filename)
RichTextBox1.Text = Replace(RichTextBox1.Text,"置換元文字", "置換先文字")
RichTextBox1.SaveFile (filename), 1
'===============================
こんな感じで
早速の回答ありがとうございました。
RichTextBoxを使った方法でやってみました。
すると、ファイルを読み込んだ時点(.LoadFile)で、一部の行が
改行されてしまうのですが、改行されずにやる方法はないでしょうか?
例)
元のファイル内容:
34行目:・・・・
35行目:Color:Yellow
36行目:Date:2003-10-1
37行目:Temp:****.doc
38行目:・・・・
↓上記で文字列「Yellow」⇒「Blue」に置換する。
34行目:・・・・
35行目:Color:Blue
36行目:Date:2003-10-1
37行目: ←(全然関係ないところで、改行が入ってしまう)
38行目:Temp:****.doc
39行目:・・・・
え!
そんなところに改行が入るはずはないんですが....
もしかしたらRichTextBoxコントロールのバグに引き込んでしまったかも。
よろしければVBのバージョンとサービスパックのバージョンを教えて下さい。
最新のサービスパックを当ててだめなら、
RichTextBoxの代りに文字列で
Dim s As String, a As String
Dim FileNo
FileNo = FreeFile
Open FileName For Input As #FileNo
While Not EOF(FileNo)
Line Input #FileNo, a
s = s & a & vbCrLf
Wend
Close
s = Left(s, Len(s) - 2) '最後の改行を取る
s = Replace(s, 置換元, 置換先)
FileNo = FreeFile
Open FileName For Output As #FileNo
Print #FileNo, s
Close
この方がメモリーの消費は少ないです。
上記のプログラムは次のプログラムと等価です。
Dim FileNo As Long
Dim s as String
FileNo=FreeFile()
Open Filename For Binary As #FileNo
st=Space(LOF(FileNo))
Get #FileNo,1,st
Close #FileNo
st=Replace(st,元の文字列,置換文字列)
回答ありがとうございます。
使っているVBは、Version6.0(SPなし)です。(ちなみにOSは、XPです。)
確認したところ、RichTextBox1.LoadFile(filename)でファイルを
読み込んだ後、Form上のRichTextBox1.Textで表示したところ、
改行されていませんでした。
ところが、
Debug.print RichTextBox1.Textを追加して、イミディエイトウィンドウで
確認したところ、改行されていました。
なぜ、このようになるのか不明ですが、文字数の制限とかあるのでしょうか?
>SPなし
SP5は是非あててください。
つまらないバグで結構悩みます。
これでなおる可能性は有ります。
>イミディエイトウィンドウで
>確認したところ、改行されていました。
原因はわかりません。同じような経験があり興味はあります。
>文字数の制限とかあるのでしょうか?
記憶ですが文字列もRichTextBoxも最大は2Gと思います。
イトウさん
>st=Space(LOF(FileNo))
これだとLof(FileNo)にバイナリのデーターの大きさが入ってしまい
全角交じりの文字の長さと合わずに、全角の文字があるとその数だけ
スペースが最後に挿入されるような.....
つまり”aaaあああ”のファイルがあるとLOF(FileNo)はvbCrLf含め11返す為
stには11個の空白が用意される為、ファイルを読み込むと
”aaaあああ "となるような気がするのですがいかがでしょうか。
>st=Space(LOF(FileNo))
とりあえずうち(Win95 XP,VB6 SP?)ではなりませんでした。
でも、確かに不安が残るのでByte配列で処理したほうが安全かもしれません。
ツイート | ![]() |