2008-10-02 2 views
2

Мне просто интересно, знал ли кто-нибудь о том, как я могу разобрать файл в нижней части сообщения.Что было бы лучшим способом разобрать этот файл?

У меня есть база данных с правильными таблицами для каждого раздела, например, Refferal Table, Caller Table, Location Table. Каждая таблица имеет те же столбцы, которые отображаются в файле ниже

Мне бы очень понравилось что-то, что является довольно генетическим, поэтому, если изменение макета файла не изменит меня во многом. На данный момент я просто читаю файл в строке за раз и просто использую оператор case, чтобы проверить, в каком разделе я вхожу.

Может ли кто-нибудь помочь мне в этом?

PS. Я использую VB но C# или что-нибудь еще будет хорошо, также иксы в документе только личные данные я гасятся

Спасибо, Натан

Файл: --->

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

Google has the answers, как только вы знаете, что файл формата называется «.ini»

Edit: то есть, что это .ini плюс некоторые дополнительные начальные/конечные дрянь.

+0

Похоже, что .ini, за исключением последней строки, представляет собой просто неструктурированный текст. – 2008-10-02 06:33:51

+0

О, и первые четыре строки. – 2008-10-02 06:34:25

4

Вы можете прочитать каждую строку файла последовательно. Каждая строка - это, по существу, пара значений имени. Поместите каждое значение в карту (хеш-таблицу), введенную по имени. Используйте карту для каждого раздела. По завершении разбора файла у вас будут карты, содержащие все пары значений имени. Итерации по каждой карте и заполнение таблиц базы данных.

2

Я бы направился в Python для любого типа синтаксического анализа строки. Я не уверен, какую часть этой информации вы хотите сохранить, но я, возможно, использовал бы функцию PPython, чтобы разбить на =, чтобы избавиться от знака равенства, а затем вырезать пробел из второго фрагмента пирога.

Во-первых, я бы маскировать информацию заголовка/нижнего колонтитула Я знаю, что не нужно, то сделать что-то похожее на следующее:

Давайте кусок и сохранить его в 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', ''] 

Это по существу даст вам [столбец, Value] кортеж можно использовать для вставки данных в вашу базу данных (после того, как ESCA ping все строки и т. д., предупреждение SQL Injection).

Это предполагает, что ввод электронной почты и ваша БД будут иметь одинаковые имена столбцов, но если бы они этого не сделали, было бы довольно тривиально настраивать сопоставление столбцов с использованием словаря. С другой стороны, если электронная почта и столбцы синхронизированы, вам не нужно знать имена столбцов, чтобы получить разбор.

Вы можете выполнить итерацию через псевдо-словарь и распечатать каждую пару значений ключа в нужном месте в вашей параметризованной строке sql.

Надеюсь, это поможет!

Редактировать: Хотя это в Python, C#/VB.net должны иметь одинаковые/схожие возможности.

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 
Смежные вопросы