大きな(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>
その有効なXMLファイルであれば、あなたは適切なXMLパーサー(大きなファイルのための好適なSAXパーサ)を使用するようになっているはずです。 XSLTを使用してxmlを変換し、必要な出力を生成することもできます。 –
SQL Server Expressを使用している可能性があります。参照:https://www.microsoft.com/en-ca/sql-server/sql-server-editions-expressこれでデータセット全体をインポートし、さらに簡単に分析できるはずです。 –
XMLが適切にフォーマットされていることを保証することはできません。私のパートナーはいくつかのパーサを試して、ファイルが適切にフォーマットされていないと宣言します。それがファイルサイズかフォーマットのためかどうかわかりません。彼がSAXを試したかどうか確認します。 SAXに必要なコーディングは私の能力を超えています。 私は簡単にXSLTを見てきました。それは6GBのファイルサイズを扱うでしょうか? – Andrew