큰 (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 근처에서 찾아 내지 못했습니다. 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 파서 (대형 파일에 적합한 SAX 파서를) 사용 보일 것입니다. 또한 XSLT를 사용하여 XML을 변환하여 필요한 출력을 생성 할 수 있습니다. –
아마도 SQL Server Express를 사용하는 것이 좋습니다. 참조 : https://www.microsoft.com/en-ca/sql-server/sql-server-editions-express. 이것을 사용하여 전체 데이터 세트를 가져와 훨씬 쉽게 분석 할 수 있어야합니다. –
XML의 형식이 올바르지 않습니다. 제 파트너가 두 개의 파서를 시도했으며 파일 형식이 올바르지 않다고 선언합니다. 우리는 그것이 파일 크기 또는 형식화 때문인지 여부를 알 수 없습니다. SAX를 시도했는지 확인해 보겠습니다. SAX에 필요한 코딩은 저의 능력 이상입니다. XSLT를 간략하게 살펴 보았습니다. 6GB의 파일 크기를 처리합니까? – Andrew