所以我有一个循环应该做三件事,逐行查看文本文件,文本文件包含路径名和文件名(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
提前致谢!
答案 0 :(得分: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。
答案 1 :(得分:1)
#3 =替换$ ...是你的问题路线...修复这个和其他东西导致这个:
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
答案 2 :(得分:0)
我看到的一个问题是你打开文件句柄,然后是#3,但是你按照相同的顺序关闭它们,你应该关闭#3,然后关闭文件句柄。
我看到发生的是文件句柄被打开,然后它搜索包含“.log”的行,然后它做了一些事情 - 到目前为止,非常好。然而,它然后打开#3,做其他事情,然后循环。它完成后需要关闭#3。
将“关闭#3”向上移动4行(到“#3 =替换...”之后的下一个语句应该按照预期进行,并且应该编译好。
答案 3 :(得分:0)
我想建议一种不同的方法。我做过类似的事情,除了我事先知道我正在制作副本,我的方法是打开源和新目标(副本)。然后,我逐行读取源文件,在将其写回到副本之前,对变量进行所需的更改。我的文件从来没有超过几个k,这足够快,并消除了你的一个循环。您必须在循环中有一个变量来告诉您在完成后将文件重命名为什么,或者如果找不到您要查找的行并且不需要副本,则删除该文件。