2017-12-21 1 views
0

大きな(6GB)txt/xlmファイルを開いて解析し、解析された情報を新しいものに保存しようとしています小さいファイル。簡単に言うと、私は(パースで大丈夫やっている大きなtxtまたはxmlファイル(6GB)のコピーを開く、解析する、保存する

a | b | 
x | y | z 
aa | | cc 
    | GG | HH 

...私は次のように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> 

を持っている...と私はそれを構文解析したいです後で質問するかもしれませんが)。私の主な問題は、大きな6GBのファイルを処理することです。

約30MBまでのファイルを開いたり、操作したり、保存したりすることができます。その後、Excelは死ぬ。 50MB後のどこかで、私は "File already open"というコードエラーが出てきます。だから私の質問は、この本当に大きなファイル(6GB)でどうすればいいですか?私はVBAが最善の方法ではないことを知っていますが、ファイルやMSアプリケーションのような2GBの容量のAccess Crapをロードするテキストエディタは見つかりませんでした。 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></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></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

その有効なXMLファイルであれば、あなたは適切なXMLパーサー(大きなファイルのための好適なSAXパーサ)を使用するようになっているはずです。 XSLTを使用してxmlを変換し、必要な出力を生成することもできます。 –

+0

SQL Server Expressを使用している可能性があります。参照:https://www.microsoft.com/en-ca/sql-server/sql-server-editions-expressこれでデータセット全体をインポートし、さらに簡単に分析できるはずです。 –

+0

XMLが適切にフォーマットされていることを保証することはできません。私のパートナーはいくつかのパーサを試して、ファイルが適切にフォーマットされていないと宣言します。それがファイルサイズかフォーマットのためかどうかわかりません。彼がSAXを試したかどうか確認します。 SAXに必要なコーディングは私の能力を超えています。 私は簡単にXSLTを見てきました。それは6GBのファイルサイズを扱うでしょうか? – Andrew

答えて

0

ありがとうございます。私はVBAルートを放棄した。大きなファイルを処理できないように見えました。私はDBルートに行き、大規模なXMLファイルを単一の列の単一行テーブルに正常にインポートしました。そこでは、より合理化されたフラット(TXT)ファイルをクエリして生成することができました。 URL hereにあるプロセスを使用しました。

おかげで再び、 アンドリュー

関連する問題