打开,解析和保存大型txt或xml文件的副本(6gb)

时间:2017-12-21 16:48:43

标签: xml vba parsing

我正在尝试打开一个大的(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>

1 个答案:

答案 0 :(得分:0)

谢谢。我放弃了VBA路线。看起来它永远无法处理大文件。我使用DB路由并成功将大型XML文件导入单列单行表,在那里我能够查询并生成更加简化的平面(TXT)文件。我使用了网址here中找到的流程。

再次感谢, 安德鲁