0

我有一个 do-while 循环,它应该做三件事,逐行浏览文本文件,文本文件包含路径名和文件名(C:\Folder\file1.txt)。

如果该行包含某个字符串,则它将文件复制到该位置,将其重命名为文本文件中的名称,然后替换复制文件中的字符串。
如果不是,则继续下一行。

我认为这将是相当直截了当的,但它似乎并没有奏效。我目前甚至无法编译,因为我收到错误说循环的语法错误。

任何帮助将不胜感激,这是整个函数的代码:

Private Sub Command2_Click()

    Dim LineData As String 
    Dim FileHandle As Integer

    FileHandle = FreeFile
    Open "C:\textfile.txt" For Input As #FileHandle

    Do While Not EOF(FileHandle)
        Line Input #FileHandle, LineData
        If InStr(LineData, ".log") Then
            FileCopy "C:\thefile.log",LineData
            Open LineData For Input As #3
             #3 = Replace$(#3, "abc", "xyz")
        Else
        End If  
    Loop
    
    Close #FileHandle
    Close #3

    MsgBox "Copy, Replace, Complete!"

End Sub

提前致谢!

4

4 回答 4

1

我不相信

#3 = Replace$(#3, "abc", "xyz")

已验证。您需要逐行读取该文件的内容(或一次读取一些合理的块),进行替换,然后将其写回新文件。当您无论如何都在复制文件时,我建议您从源位置读取它,并将新版本写入文件将被复制到的位置。

例如...

Private Sub Command2_Click()
 Dim LineData As String
 Dim FileHandle As Integer
 Dim sourceHandle as Integer
 Dim destHandle as Integer
 dim temp as string
 FileHandle = FreeFile
 Open "C:\textfile.txt" For Input As #FileHandle
 Do While Not EOF(FileHandle)
  Line Input #FileHandle, LineData
  If InStr(LineData, ".log") Then
   sourceHandle=FreeFile
   Open "C:\thefile.log" For Input as #sourceHandle
   destHandle=FreeFile
   Open LineData For Output as #destHandle
   Do while Not EOF(sourceHandle)
    Line Input #sourceHandle,temp
    temp=replace$(temp,"abc","xyz")
    Print #destHandle,temp
   Loop
   Close #destHandle
   Close #sourceHandle
  End If
 Loop
Close #FileHandle
MsgBox "Copy, Replace, Complete!"
End Sub

抱歉,如果有任何错误,由于我没有在这台计算机上安装 VB IDE,因此未经测试。

于 2008-11-15T22:07:35.900 回答
1

#3 = Replace$... 是您的问题线...修复该问题和其他内容会导致:

Private Sub Command2_Click()
  Dim LineData As String
  Dim FileHandle As Integer
  Dim Buffer As String
  FileHandle = FreeFile
  Open "C:\thefile.log" For Binary Access Read As #FileHandle
  Buffer = Space(LOF(FileHandle))
  Get #FileHandle, , Buffer
  Buffer = Replace(Buffer, "abc", "xyz")
  Close #FileHandle
  FileHandle = FreeFile
  Open "C:\textfile.txt" For Input As #FileHandle
  Do Until EOF(FileHandle)
    Line Input #FileHandle, LineData
    If InStr(LineData, ".log") Then
      Open LineData For Output As #3
      Print #3, Buffer;
      Close #3
    End If
  Loop
  Close #FileHandle
  MsgBox "Copy, Replace, Complete!"
End Sub

如果您更喜欢极简主义和简短的代码,则可以改用:

Private Sub Command2_Click()
  ''// This code requires a reference to Microsoft Scripting runtime (Project -> References)
  Dim FSO As New Scripting.FileSystemObject
  Dim Files() As String
  Dim File As String
  Dim Data As String
  Data = Replace(FSO.OpenTextFile("C:\thefile.log").ReadAll(), "abc", "xyz")
  Files = Split(FSO.OpenTextFile("C:\textfile.txt").ReadAll(), vbCrLf)
  For Each File In Files
    If InStr(File, ".log") > 0 Then FSO.CreateTextFile(File, True).Write Data
  Next
  MsgBox "Copy, Replace, Complete!"
End Sub
于 2008-11-16T12:04:30.860 回答
0

我看到的一个问题是你打开文件句柄,然后是#3,但是你以相同的顺序关闭它们,你应该关闭#3,然后是文件句柄。

我看到发生的是文件句柄被打开,然后它搜索包含“.log”的行,然后它做了一些事情——到目前为止,一切都很好。然而,它随后打开#3,执行其他操作,然后循环。完成后需要关闭#3。

将“Close #3”向上移动 4 行(到“#3 = Replace...”之后的下一条语句应该符合您的预期并且应该可以编译。

于 2008-11-15T22:00:36.537 回答
0

我想向您建议一种不同的方法。我做过类似的事情,只是我事先知道我正在制作副本,我的方法是打开源代码和新目标(副本)。然后我逐行读取源文件,对我读入的变量进行必要的更改,然后再将其写回副本。我的文件永远不会超过几个 k,这足够快并且消除了你的一个循环。您必须在循环内有一个变量来告诉您在完成后将文件重命名为什么,或者如果您没有找到您正在寻找的行并且不需要副本,则删除该文件。

于 2009-10-05T16:36:43.427 回答