我正在尝试打开一个大的(6gb)txt / xlm文件,对其进行解析,并将解析后的信息保存到一个新的小得多的文件中。最简单的是,我有一个类似于......的xml文件。
<cat>
<a1>a</a1>
<b1>b</b1>
</cat>
<cat>
<a1>x</a1>
<b1>y</b1>
<c1>z</c1>
</cat>
<cat>
<a1>aa</a1>
<b1/>
<c1>cc</c1>
</cat>
<cat>
<a1></a1>
<b1>GG</b1>
<c1>HH</c1>
</cat>
...我想解析它......
a | b |
x | y | z
aa | | cc
| GG | HH
我正在解析(虽然我可能会在稍后提问)。我的主要问题是处理大型6gb文件。
我可以打开,操作和保存最大约30mb的文件。之后,Excel死了。在50mb之后的某个地方,我开始收到代码错误,说“文件已经打开”。我的问题是,我如何处理这个非常大的文件(6gb)?我知道VBA不是最好的方式,但是我没有找到文本编辑器来加载文件和MS应用程序就像大约2gb的Access废话一样。在Excel以外的应用程序中运行VBA会更好吗?在.asp页面上使用FSO会更好吗?我很难过。任何帮助将不胜感激。
提前谢谢你, 安德鲁
以下是我一直在尝试的代码的简化版本:
Public Sub atest()
Dim filePath As String
Dim breakIdentity As String
Dim piece As String
Dim newFilePath As String
Dim strIn As String
Dim lineCtr As Long
filePath = Sheets("Parse").Range("A2").Value
newFilePath = Replace(filePath, ".txt", "-ReFormatted.txt")
Open filePath For Input As #1
Open newFilePath For Output As #2 'HERE IS WHERE I GET FILE ALREADY OPEN ERRORS ON LARGE FILES
Do While Not EOF(1)
Line Input #1, strIn
If Len(strIn) > 1 Then
lineCtr = lineCtr + 1
If InStr(strIn, breakIdentity) <> 0 And lineCtr > 1 Then
Print #2, strIn
Debug.Print strIn
End If
End If
Loop
Close #1
Close #2
MsgBox "Done"
End Sub
以下是txt / xml ...
的示例<?xml version="1.0" encoding="UTF-8"?>
<TagValidationList>
<TVLHeader>
<SubmissionType>STVL</SubmissionType>
<SubmissionDateTime>2017-10-02T01:03:15Z</SubmissionDateTime>
<SSIOPHubID>9002</SSIOPHubID>
<HomeAgencyID>9002</HomeAgencyID>
<BulkIndicator>B</BulkIndicator>
<BulkIdentifier>32</BulkIdentifier>
<RecordCount>15482798</RecordCount>
</TVLHeader>
<TVLDetail>
<TVLTagDetails>
<HomeAgencyID>0041</HomeAgencyID>
<TagAgencyID>1110</TagAgencyID>
<TagSerialNumber>01234567</TagSerialNumber>
<TagStatus>V</TagStatus>
<TagClass>2</TagClass>
<TVLPlateDetails>
<PlateCountry>US</PlateCountry>
<PlateState>TX</PlateState>
<PlateNumber>ABC123</PlateNumber>
<PlateEffectiveFrom>2010-09-09T15:57:05Z</PlateEffectiveFrom>
</TVLPlateDetails>
<TVLAccountDetails>
<AccountNumber>7654321</AccountNumber>
</TVLAccountDetails>
</TVLTagDetails>
<TVLTagDetails>
<HomeAgencyID>0041</HomeAgencyID>
<TagAgencyID>1110</TagAgencyID>
<TagSerialNumber>21234567</TagSerialNumber>
<TagStatus>V</TagStatus>
<TagType>S</TagType>
<TagClass>2</TagClass>
<TVLPlateDetails>
<PlateCountry>US</PlateCountry>
<PlateState>TX</PlateState>
<PlateNumber>BBC123</PlateNumber>
<PlateEffectiveFrom>2010-09-09T16:14:43Z</PlateEffectiveFrom>
</TVLPlateDetails>
<TVLAccountDetails>
<AccountNumber>6543210</AccountNumber>
</TVLAccountDetails>
</TVLTagDetails>
<TVLTagDetails>
<HomeAgencyID>0041</HomeAgencyID>
<TagAgencyID>1110</TagAgencyID>
<TagSerialNumber>31234567</TagSerialNumber>
<TagStatus>V</TagStatus>
<TagClass>2</TagClass>
<TVLPlateDetails>
<PlateCountry>US</PlateCountry>
<PlateState>TX</PlateState>
<PlateNumber>CBC123</PlateNumber>
<PlateEffectiveFrom>2010-09-09T15:58:15Z</PlateEffectiveFrom>
</TVLPlateDetails>
<TVLAccountDetails/>
</TVLTagDetails>
</TVLDetail>
</TagValidationList>
答案 0 :(得分:0)
谢谢。我放弃了VBA路线。看起来它永远无法处理大文件。我使用DB路由并成功将大型XML文件导入单列单行表,在那里我能够查询并生成更加简化的平面(TXT)文件。我使用了网址here中找到的流程。
再次感谢, 安德鲁