我在 excel 中使用 VBA,它查找特定值是否存在于像 XML 文件一样编码的文件中。XML 文件很大(超过 100000 行,只有几百万个字符),为了提高我将 XML 文件加载到数组的速度。当我使用 100 个 XML 文件时,一切都对我有用,但是,如果有超过 200 个 XML 文件,excel 将消耗过多的 RAM,并且代码会因“运行时错误 7 内存不足”而失败。
我想我只需要 XML 代码中的特定值,这些值总是以: 开头并以:="
结尾"
,所以如果我删除其他所有内容并只保留所需的文本,这将节省大量消耗的 RAM。
例如,我的 XML 文件包含:
...
$<yiapcspvgdldm:Condition.ActionTypes>
<yiapcspvgdldm:ColorChange
BrushStyle="H1"
ColorChangeType="NormalColorChange"
Color="#00FFFFFF"
PropertyName="Foreground" />
<yiapcspvgdldm:Blinking
PropertyName="Foreground" />
<yiapcspvgdldm:Set
AttributeName="Visibility"
AttributeType="System"
To="{x:Static Visibility.Hidden}" />
</yiapcspvgdldm:Condition.ActionTypes>$
...
在这种情况下,我只需要:
H1
NormalColorChange
#00FFFFFF
Foreground
Foreground
Visibility
System
{x:Static Visibility.Hidden}
正如我提到的,每个文件包含 > 100000 行,我试图遍历字符串的每一行EOF
,但这需要很长时间……我尝试了 SPLIT 函数,但这只是拆分文本,并没有删除不需要的文本。我试图在这里找到我的答案,但没有成功。任何帮助都感激不尽。
这是我提取的 SUB:
Dim GrapicFiles(), GrapicText() As String
Dim PrjtFolder as string
Sub LoadXML()
Dim i, GraphCount As Integer
Dim Path, FileName As String
Dim objFSO, objTF As Object
Dim strIn As Variant
PrjtFolder="C:\temp\"
If Worksheets("Work").FilterMode Then Worksheets("Work").ShowAllData
GraphCount = Application.WorksheetFunction.CountA(Worksheets("Work").Range("B:B")) - 1
For i = 1 To GraphCount
DoEvents
FileName = Worksheets("Work").Cells(i + 1, 2).Value
Path = PrjtFolder & FileName & "\Main.xml"
'Load files to array
ReDim Preserve GrapicFiles(UBound(GrapicFiles) + 1)
ReDim Preserve GrapicText(UBound(GrapicText) + 1)
'Text Reading
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTF = objFSO.OpenTextFile(Path, 1)
strIn = objTF.readall
objTF.Close
Set objFSO = Nothing
Set objTF = Nothing
'>>>>>>>I will need something here to make my 'strIn' string smaller
'saving to array
GrapicFiles(i) = FileName
GrapicText(i) = strIn
Set strIn = Nothing
Next i
End Sub
这可能会帮助您解析这些行:
Dim GrapicText() As String
Dim sLine As String
Dim i As Long, iPos As Long
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTF = objFSO.OpenTextFile("C:\Users\acs.erno\Documents\Prog\Frm\x.xml", 1)
strIn = objTF.readall
objTF.Close
Set objFSO = Nothing
Set objTF = Nothing
GrapicText = Split(strIn, vbCrLf) ' split to buffer
For i = LBound(GrapicText) To UBound(GrapicText)
iPos = InStr(GrapicText(i), "=")
If iPos > 0 Then ' lines with "=" only
sLine = Mid$(GrapicText(i), iPos + 2)
iPos = InStrRev(sLine, """") ' find terminal "
If iPos > 1 Then sLine = Left$(sLine, iPos - 1)
Debug.Print sLine
End If
Next
还有 1 条评论:将Dim GrapicFiles(), GrapicText() As String
GrapicFiles() 声明为Variant
. 写Dim GrapicFiles() As String, GrapicText() As String
,如果你想它String
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句