首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打开、解析和保存大型txt或xml文件(6 6gb)的副本

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

Stack Overflow用户
提问于 2017-12-22 00:48:43
回答 1查看 406关注 0票数 0

我正在尝试打开一个大的(6 6gb) txt/xlm文件,解析它,并将解析后的信息保存到一个小得多的新文件中。在最简单的情况下,我有一个类似于...

代码语言:javascript
复制
<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>

...and我想把它解析成..。

代码语言:javascript
复制
a  | b  |
x  | y  | z
aa |    | cc
   | GG | HH

我在解析方面做得很好(尽管稍后我可能会问一些问题)。我的主要问题是处理6 6gb的大文件。

我可以打开、操作和保存高达30mb的文件。在那之后,Excel就死了。在50mb之后的某个地方,我开始收到代码错误,说“文件已经打开”。所以我的问题是,我如何处理这个非常大的文件(6 6gb)?我知道VBA不是最好的方法,但我还没有找到可以加载文件的文本编辑器,而MS应用程序的访问速度只有2 2gb左右。在Excel以外的应用程序中运行VBA会更好吗?在.asp页面上使用FSO会更好吗?我被难住了。任何帮助都将不胜感激。

先谢谢你,安德鲁

以下是我一直在尝试的代码的简化版本:

代码语言:javascript
复制
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的一个示例。

代码语言:javascript
复制
<?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>
EN

回答 1

Stack Overflow用户

发布于 2017-12-22 22:14:17

谢谢。我放弃了VBA路由。看起来它永远无法处理这个大文件。我采用了DB方法,并成功地将大型XML文件导入到一个单列单行表中,在这个表中,我可以查询并生成一个更流线型的平面(TXT)文件。我使用了在URL here中找到的过程。

再次感谢你,安德鲁

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47929360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档