在数组的循环中附加文本文件只打印第一个文件的一个字母
Appending text files in a loop on array only prints 1 letter of first file
我有一个文件夹 C:\test\
,其中包含多个 .txt
文件,我需要将这些文件附加到一个输出文本文件。使用 FSO 和 TextStream 我可以以这种方式毫无问题地显式写入文件:
Public Sub test()
Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
Const Path As String = "C:\test\"
Dim helloWorld As Object
Set helloWorld = FSO.CreateTextFile(FileName:=(Path & "helloworld.txt"), OverWrite:=True, Unicode:=False)
helloWorld.WriteLine FSO.GetFile("C:\test\Product_ID_update.txt").OpenAsTextStream(ForReading).ReadAll
helloWorld.WriteLine FSO.GetFile("C:\test\RPT-4475.txt").OpenAsTextStream(ForReading).ReadAll
helloWorld.Close
End Sub
它工作得很好,但我有数百个文件要追加,所以将它们全部键入会很疯狂,所以我写了一些代码将所有文件名放入一个数组中,然后遍历每个索引以生成文件路径。这是代码:
Sub Combine_Text_Files2()
Dim InputDirPath As String
InputDirPath = "C:\test\"
Dim InputFileType As String
InputFileType = "*.txt"
Dim OutputDirPath As String
OutputDirPath = "C:\test\"
Dim OutputFileName As String
OutputFileName = "_CombinedOutput.txt"
Dim InputFileName As String
InputFileName = Dir$(InputDirPath & InputFileType)
Dim FileArray() As String
Dim i As Integer: i = 0
Do Until InputFileName = vbNullString
ReDim Preserve FileArray(0 To i)
FileArray(i) = InputFileName
InputFileName = Dir$
i = i + 1
Loop
Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
Dim Stream As Object
Set Stream = FSO.CreateTextFile((OutputDirPath & OutputFileName), OverWrite:=True, Unicode:=False)
Dim FileNameAndPath As String
For i = LBound(FileArray) To UBound(FileArray)
FileNameAndPath = (InputDirPath & FileArray(i))
Debug.Print ("Processing: " & FileNameAndPath)
Dim fileToCopy As File
Set fileToCopy = FSO.GetFile(FileNameAndPath)
Dim streamToCopy As TextStream
Set streamToCopy = fileToCopy.OpenAsTextStream(ForReading)
Dim text As String
text = streamToCopy.ReadAll
Stream.WriteLine FSO.GetFile(FileNameAndPath).OpenAsTextStream(ForReading).ReadAll
Debug.Print ("Appended to " & OutputFileName & ": " & FileNameAndPath)
Next i
Stream.Close
End Sub
FileNameAndPath
值得到正确更新,并且当它经过第一个 Stream.WriteLine
迭代时,它附加 仅第一个文件的第一个字母 到输出文件,然后继续下一次迭代,在下一次 Stream.WriteLine
由于 Invalid procedure call or argument
而失败。
我已经尝试调试了很长一段时间,但不确定是什么原因造成的。我能想到的唯一可能导致它的是数组,因为它真的是唯一不同的东西 AFAIK...任何帮助将不胜感激!
其他详细信息
如果我注释掉 WriteLine
调用,它会遍历整个数组,立即打印所有文件路径。如您所见,我将原来的一行代码分解为多个步骤进行调试。
复制它很容易:
- 创建一个
C:\test\
目录
- 创建两个或多个文本文件并向每个文件添加文本内容
- 运行 VBE中的代码
我发现了问题。问题不在于代码,它工作正常(虽然我确信可以改进,但我会把它交给代码审查)。
问题是一些源文件实际上最初是 Excel 文档,后来被转换为 .txt
并且显然携带了记事本忽略的一些元数据,但是 VBA 编译器不知道如何尝试将其放入 String
。
吸取教训,对源数据执行健全性检查。
我有一个文件夹 C:\test\
,其中包含多个 .txt
文件,我需要将这些文件附加到一个输出文本文件。使用 FSO 和 TextStream 我可以以这种方式毫无问题地显式写入文件:
Public Sub test()
Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
Const Path As String = "C:\test\"
Dim helloWorld As Object
Set helloWorld = FSO.CreateTextFile(FileName:=(Path & "helloworld.txt"), OverWrite:=True, Unicode:=False)
helloWorld.WriteLine FSO.GetFile("C:\test\Product_ID_update.txt").OpenAsTextStream(ForReading).ReadAll
helloWorld.WriteLine FSO.GetFile("C:\test\RPT-4475.txt").OpenAsTextStream(ForReading).ReadAll
helloWorld.Close
End Sub
它工作得很好,但我有数百个文件要追加,所以将它们全部键入会很疯狂,所以我写了一些代码将所有文件名放入一个数组中,然后遍历每个索引以生成文件路径。这是代码:
Sub Combine_Text_Files2()
Dim InputDirPath As String
InputDirPath = "C:\test\"
Dim InputFileType As String
InputFileType = "*.txt"
Dim OutputDirPath As String
OutputDirPath = "C:\test\"
Dim OutputFileName As String
OutputFileName = "_CombinedOutput.txt"
Dim InputFileName As String
InputFileName = Dir$(InputDirPath & InputFileType)
Dim FileArray() As String
Dim i As Integer: i = 0
Do Until InputFileName = vbNullString
ReDim Preserve FileArray(0 To i)
FileArray(i) = InputFileName
InputFileName = Dir$
i = i + 1
Loop
Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
Dim Stream As Object
Set Stream = FSO.CreateTextFile((OutputDirPath & OutputFileName), OverWrite:=True, Unicode:=False)
Dim FileNameAndPath As String
For i = LBound(FileArray) To UBound(FileArray)
FileNameAndPath = (InputDirPath & FileArray(i))
Debug.Print ("Processing: " & FileNameAndPath)
Dim fileToCopy As File
Set fileToCopy = FSO.GetFile(FileNameAndPath)
Dim streamToCopy As TextStream
Set streamToCopy = fileToCopy.OpenAsTextStream(ForReading)
Dim text As String
text = streamToCopy.ReadAll
Stream.WriteLine FSO.GetFile(FileNameAndPath).OpenAsTextStream(ForReading).ReadAll
Debug.Print ("Appended to " & OutputFileName & ": " & FileNameAndPath)
Next i
Stream.Close
End Sub
FileNameAndPath
值得到正确更新,并且当它经过第一个 Stream.WriteLine
迭代时,它附加 仅第一个文件的第一个字母 到输出文件,然后继续下一次迭代,在下一次 Stream.WriteLine
由于 Invalid procedure call or argument
而失败。
我已经尝试调试了很长一段时间,但不确定是什么原因造成的。我能想到的唯一可能导致它的是数组,因为它真的是唯一不同的东西 AFAIK...任何帮助将不胜感激!
其他详细信息
如果我注释掉 WriteLine
调用,它会遍历整个数组,立即打印所有文件路径。如您所见,我将原来的一行代码分解为多个步骤进行调试。
复制它很容易:
- 创建一个
C:\test\
目录 - 创建两个或多个文本文件并向每个文件添加文本内容
- 运行 VBE中的代码
我发现了问题。问题不在于代码,它工作正常(虽然我确信可以改进,但我会把它交给代码审查)。
问题是一些源文件实际上最初是 Excel 文档,后来被转换为 .txt
并且显然携带了记事本忽略的一些元数据,但是 VBA 编译器不知道如何尝试将其放入 String
。
吸取教训,对源数据执行健全性检查。