一回も披露したことのない豆知識

お世話になります。

vb6なんですけどテキストファイルを読み込んで
偶数行のある文字を置換したいんですけど
このサンプルをどういう風に改変して偶数行の文字列をある文字列に
置換するコードを書いてよいのかわかりません。

置換するのはreplace関数を使うと思うのですが。
教えて下さい。お願いします。


Dim n As Long, tmp As String
n = FreeFile
Open "D:\Test.txt" For Input As #n
Line Input #n, tmp
Close #n

A 回答 (4件)

Sub Test()


  Dim l_strBuff  As String
 
  '一度に読み込み
  l_strBuff = ReadFile("C:\test.txt")
  
  '偶数行の置き換え
  l_strBuff = Replase偶数(l_strBuff, "AA", "ZZ")
End Sub

'偶数行の置き換え
Private Function Replase偶数(p_strBuff As String, str1 As String, str2 As String) As String
  Dim l_varBuff  As Variant
  Dim i      As Long
  
  l_varBuff = Split(p_strBuff, vbCrLf)
  
  For i = LBound(l_varBuff) + 1 To UBound(l_varBuff) Step 2
    l_varBuff(i) = Replace(l_varBuff(i), str1, str2)
  Next i
  
  Replase偶数 = Join(l_varBuff, vbCrLf)
End Function

'一度に読み込み
Private Function ReadFile(p_strPath As String) As String
  Dim l_fsoObj  As Object  'Scripting.FileSystemObject
  Dim l_rstTxt  As Object  'Scripting.TextStream
  Dim l_strRet  As String
  
  Set l_fsoObj = CreateObject("Scripting.FileSystemObject")
  Set l_rstTxt = l_fsoObj.OpenTextFile(p_strPath, 1)
  
  l_strRet = l_rstTxt.ReadAll()
  l_rstTxt.Close
  
  
  ReadFile = l_strRet
End Function
    • good
    • 0
この回答へのお礼

ありがとうございます。
fileをセーブする関数はどうやってやるんでしょうか?

教えて下さい。

お礼日時:2006/12/18 16:45

Sub test01()


Dim ln As Long, tmp As String
ln = 0
Open "C:\Documents and Settings\XXXX\My Documents\test.txt" For Input As #1
Open "C:\Documents and Settings\XXXX\My Documents\Testo.txt" For Output As #2
While Not EOF(1)
Line Input #n, tmp
' MsgBox tmp
ln = ln + 1
' MsgBox Ln - 2 * Int(Ln / 2)
If ln - 2 * Int(ln / 2) = 0 Then
tmpx = Replace(tmp, "bbb", "CCCC")
Else
tmpx = tmp
End If
Print #2, tmpx
Wend
Close #1
Close #2
End Sub
旧いスタイルですが、良ければ。

aaabbbxxx
ssddbbbgggg
ddcvbbb
ffghbbbbmmm

aaabbbxxx
ssddCCCCgggg
ddcvbbb
ffghCCCCbmmm
    • good
    • 0

'一度に書き込み


Private Sub WriteFile(p_strPath As String, p_strBuff As String)
  Dim l_fsoObj  As Object  'Scripting.FileSystemObject
  Dim l_wstTxt  As Object  'Scripting.TextStream
  Set l_fsoObj = CreateObject("Scripting.FileSystemObject")
  '第二引数:1は読み込み
  '第二引数:2は書き込み
  '第二引数:8は追加
  '第三引数:Trueは、ファイルが存在していなければ作成する
  Set l_wstTxt = l_fsoObj.OpenTextFile(p_strPath, 2, True)
  l_wstTxt.Write p_strBuff
  l_wstTxt.Close
End Sub
    • good
    • 0

<C:\Temp\Test.txt>


001: AABBCC
002: AABBCC
003: AABBCC
004: AABBCC

1
001: AABBCC
2
002: AABBCC
3
003: AABBCC
4
004: AABBCC
5

行カウンターとデータを上のように表示するコードは次のようです。

Private Sub コマンド0_Click()
  Dim I    As Integer
  Dim strData As String
  
  Do
    strData = FileRead("C:\Temp\Test.txt")
    I = I + 1
    Debug.Print I
    Debug.Print strData
  Loop Until strData = ""
End Sub

表示を偶数行だけに限定する。
無行もスキップする。
などの条件を付加したコードは以下のようです。

Private Sub コマンド0_Click()
  Dim I    As Integer
  Dim strData As String
  
  Do
    strData = FileRead("C:\Temp\Test.txt")
    I = (I + 1) Mod 2
    If I = 0 And strData <> "" Then
      Debug.Print I
      Debug.Print Replace(strData, "AA", "ZZ")
    End If
  Loop Until strData = ""
End Sub

<実行結果>

0
002: ZZBBCC
0
004: ZZBBCC

少し、判定ルーチンを工夫すれば、次のように書くことも可能です。
(strData = "")の減算でIのカウントに狂いが出ますが、どうせ終了するので不具合は発生しません。

Private Sub コマンド0_Click()
  Dim I    As Integer
  Dim strData As String
  
  Do
    strData = FileRead("C:\Temp\Test.txt")
    I = (I + 1) Mod 2 + (strData = "")
    If I = 0 Then
      Debug.Print I
      Debug.Print Replace(strData, "AA", "ZZ")
    End If
  Loop Until strData = ""
End Sub

※ここでは、1行づつ読み込む 自作の FileRead 関数を利用しています。
※が、基本的なルーチンは変らないと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。
非常にわかりやすかったです。

お礼日時:2006/12/18 16:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!