2017-12-21 17 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 근처에서 찾아 내지 못했습니다. 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 파서 (대형 파일에 적합한 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에있는 프로세스를 사용했습니다. 유효한 XML 파일의 경우

다시 한 번 감사드립니다, 앤드류