2008-10-02 9 views
2

게시물 하단에있는 파일을 구문 분석 할 수있는 좋은 방법을 알고 있는지 궁금합니다.이 파일을 구문 분석하는 가장 좋은 방법은 무엇입니까?

나는 Refferal Table, Caller Table, Location Table과 같은 각 섹션에 대한 올바른 테이블을 가진 데이터베이스 설정을 가지고 있습니다. 각 테이블은 아래 파일에 보이는 것과 동일한 열을 가지고 있습니다.

파일 레이아웃이 바뀌면 주변에 많은 것들이 생기지 않을 것입니다. 지금은 한 번에 한 줄씩 파일을 읽는 중이고 어떤 문장이 들어 있는지 확인하기 위해 사례 진술을 사용하고 있습니다.

누구든지이 문제를 해결할 수 있습니까?

추신. 난 괜찮을 것 VB하지만, C# 또는 다른 것을 사용하고, 또한 문서에있는 X의 내가

감사합니다, 나단

파일

났을 한 단지 개인 정보 있습니다 --->

DIAL BEFORE YOU DIG 
Call 1100, Fax 1300 652 077 
PO Box 7710 MELBOURNE, VIC 8004 

Utilities are requested to respond within 2 working days and reference the Sequence number. 

[REFFERAL DETAILS] 
FROM=     Dial Before You Dig - Web 
TO=     Technical Services 
UTILITY ID=   xxxxxx 
COMPANY=    {Company Name} 
ENQUIRY DATE=   02/10/2008 13:53 
COMMENCEMENT DATE= 06/10/2008 
SEQUENCE NO=   xxxxxxxxx 
PLANNING=    No 

[CALLER DETAILS] 
CUSTOMER ID=   403552 
CONTACT NAME=   {Name of Contact} 
CONTACT HOURS=  0 
COMPANY=    Underground Utility Locating 
ADDRESS=    {Address} 
SUBURB=    {Suburb} 
STATE=    {State} 
POSTCODE=    4350 
TELEPHONE=   xxxxxxxxxx 
MOBILE=    xxxxxxxxxx 
FAX TYPE=    Private 
FAX NUMBER=   xxxxxxxxxx 
PUBLIC ADDRESS=  xxxxxxxxxx 
PUBLIC TELEPHONE= 
EMAIL ADDRESS=  {Email Address} 

[LOCATION DETAILS] 
ADDRESS=    {Location Address} 
SUBURB=    {Location Suburb} 
STATE=    xxx 
POSTCODE=    xxx 
DEPOSITED PLAN NO= 0 
SECTION & HUNDRED NO= 0 
PROPERTY PHONE NO= 
SIDE OF STREET=  B 
INTERSECTION=   xxxxxx 
DISTANCE=    0-200m B 
ACTIVITY CODE=  15 
ACTIVITY DESCRIPTION= xxxxxxxxxxxxxxxxxx 
MAP TYPE=    StateGrid 
MAP REF=    Q851_63 
MAP PAGE= 
MAP GRID 1= 
MAP GRID 2= 
MAP GRID 3= 
MAP GRID 4= 
MAP GRID 5= 
GPS X COORD= 
GPS Y COORD= 
PRIVATE/ROAD/BOTH= B 
TRAFFIC AFFECTED=  No 
NOTIFICATION NO=  3082321 
MESSAGE=    entire intersection of Allora-Clifton rd , Hillside 
rd and merivale st 

MOCSMESSAGE=   Digsafe generated referral 

Notice: Please DO NOT REPLY TO THIS EMAIL as it has been automatically generated and replies are not monitored. Should you wish to advise Dial Before You Dig of any issues with this enquiry, please Call 1100 

(See attached file: 3082321_LLGDA94.GML) 

답변

5
그것이 .INI 플러스 몇 가지 여분의 선도/후행 빚이다,이다 :

Google has the answers, 당신은 파일 형식이 '.INI'

편집라는 것을 알면.

+0

비정형 텍스트 인 것처럼 보이는 마지막 줄을 제외하고는 .ini와 같습니다. –

+0

오, 처음 네 줄. –

+0

사실, 선행/후행 쓰레기가 다듬어 져야하는 것처럼 보입니다. –

4

파일의 각 줄을 순차적으로 읽을 수 있습니다. 각 행은 본질적으로 이름 값 쌍입니다. 각 값을 이름으로 키순으로 맵 (해시 테이블)에 배치하십시오. 각 섹션에 대해지도를 사용하십시오. 파일을 구문 분석 할 때 모든 이름 값 쌍을 포함하는 맵을 갖게됩니다. 각지도를 반복하고 데이터베이스 테이블을 채 웁니다.

2

필자는 파이썬에 이와 같은 문자열 파싱 유형을 알려줄 것입니다. 나는이 정보의 얼마를 당신이 보유하고 싶은지 잘 모르겠다. 그러나 파이썬의 split() 함수를 사용하여 =으로 갈라서 등호를 없애고 파이의 두 번째 부분에서 공백을 제거한다.

첫째, 나는 내가 필요하지 않은 알고있는 머리글/바닥 글 정보를 마스크 것, 다음에 가깝다 뭔가를 할 :

이의이 test1.txt 그것을 덩어리를 가지고 저장하자

 
ADDRESS=    {Location Address} 
SUBURB=    {Location Suburb} 
STATE=    xxx 
POSTCODE=    xxx 
DEPOSITED PLAN NO= 0 
SECTION & HUNDRED NO= 0 
PROPERTY PHONE NO= 

여기에 작은 파이썬 코드 조각입니다 :

 
>>> f = open("test1.txt", "r") 
>>> l = f.readlines() 
>>> l = [line.split('=') for line in l] 
>>> for line in l: 
    print line 

['ADDRESS', '{Location Address}'] 
['SUBURB', '{Location Suburb}'] 
['STATE', 'xxx'] 
['POSTCODE', 'xxx'] 
['DEPOSITED PLAN NO', '0'] 
['SECTION & HUNDRED NO', '0'] 
['PROPERTY PHONE NO', ''] 

이 본질적으로 당신에게 줄 것이다 [열, 값] 당신이 ESCA 후 (데이터베이스에 데이터를 삽입하는 데 사용할 수있는 튜플 ping 모든 문자열, 등 등, SQL 주입 경고).

이것은 전자 메일 입력을 가정하고 DB의 열 이름이 같지만 그렇지 않은 경우 사전을 사용하여 열 매핑을 설정하는 것이 매우 쉽습니다. 반대로 전자 메일과 열이 동기화되어 있으면 구문 분석을 수행하기 위해 열의 이름을 알 필요가 없습니다.

의사 사전을 반복하여 매개 변수가있는 SQL 문자열의 올바른 위치에있는 각 키 - 값 쌍을 인쇄 할 수 있습니다.

희망이 도움이됩니다.

편집 : 이것은 파이썬이지만 C#/VB.net은 동일하거나 유사한 능력을 가져야합니다.

+0

다른 '컨텍스트'에서 '열'이 두 번 이상 나오지 않습니다. 예를 들어 POSTCODE는 [CALLER DETAILS] 및 [LOCATION DETAILS] 섹션에서 발생합니다. – GerG

+0

사실,하지만 삽입 할 여러 테이블에 대해 서로 다른 사전을 만들어 해결할 수 있습니다. 어쨌든 현명한 생각입니다. – pbh101

1
Using f As StreamReader = File.OpenText("sample.txt") 
    Dim g As String = "undefined" 
    Do 
     Dim s As String = f.ReadLine 
     If s Is Nothing Then Exit Do 
     s = s.Replace(Chr(9), " ") 
     If s.StartsWith("[") And s.EndsWith("]") Then 
      g = s.Substring("[".Length, s.Length - "[]".Length) 
     Else 
      Dim ss() As String = s.Split(New Char() {"="c}, 2) 
      If ss.Length = 2 Then 
       Console.WriteLine("{0}.{1}={2}", g, Trim(ss(0)), Trim(ss(1))) 
      End If 
     End If 
    Loop 
End Using 
관련 문제