我的脚本遍历.xlsx文件中的大量数据,并且根据文件是否存在,创建/打开与当前正在处理的数据集相关的文件。
确定FileSystemObject
是否应该创建/打开文本文件的代码最终会导致部分数据在 text 文件的开头重复出现。一旦改为使用单个文件就没有重复意味着处理数据提取的逻辑很好。
Set excel = CreateObject("Excel.Application")
Set excelWorkbook = excel.Workbooks.Open("C:\data.xlsx")
Set excelSheet = excelWorkbook.Worksheets(1)
Set fso = CreateObject("Scripting.FileSystemObject")
id = ""
sum = 0
row = 2
Do While row < 40500
'identifier located in column c
id = excelSheet.Range("C" & row).value
'followed by numbers in column h
'column h is empty on the row of an id
Do While Len(excelSheet.Range("H" & row+1).value) > 0
sum = excelSheet.Range("H" & row+1).value + sum
row = row + 1
Loop
WriteToText id,row,sum
sum = 0
row = row + 1
Loop
Sub WriteToText(x, y, z)
fileName = "C:\file" & x & ".txt"
If fso.FileExists(fileName) Then
Set file = fso.OpenTextFile(fileName, 8)
file.WriteLine x & " " & y " " & z
file.Close
Else
Set file = fso.CreateTextFile(fileName)
file.WriteLine x & " " & y " " & z
file.Close
End If
End Sub
这是在创建,处理和关闭文本文件后没有释放内存空间的结果吗?
Set file = Nothing
...在调用CreateTextFile
后,导致使用OpenTextFile
创建的缓冲区在内存中保留?
答案 0 :(得分:2)
如果没有看到您的数据来自哪里以及如何将数据拉到那里,就无法确定重复数据的来源。我没有在代码中看到固有的竞争条件,因为VBScript首先不是多线程的。但是,您可以通过简单地使用OpenTextFile
方法并将第三个参数设置为True
来避免与文件是否已存在有关的任何问题。这将自动创建一个丢失的文件,否则附加到它。
Sub WriteToText(x, y, z)
fileName = "C:\file" & x & ".txt"
fso.OpenTextFile(fileName, 8, True).WriteLine x & " " & y " " & z
End Sub
将对象设置为Nothing
内部函数是almost never required,因为VBScript通常会自动处理它。