Что было бы лучшим способом для анализа этого файла? - PullRequest
2 голосов
/ 02 октября 2008

Мне было просто интересно, знает ли кто-нибудь о том, как я могу разобрать файл внизу поста.

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

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

Кто-нибудь может мне помочь с этим?

PS. Я использую VB, но C # или что-то еще будет в порядке, также X в документе - это просто личная информация, которую я пропустил

Спасибо, Nathan

Файл: --->

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)

Ответы [ 4 ]

5 голосов
/ 02 октября 2008

У Google есть ответы , как только вы узнаете, что формат файла называется '.ini'

Редактировать: То есть это .ini плюс дополнительный ведущий / тянущийся ганк.

4 голосов
/ 02 октября 2008

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

2 голосов
/ 02 октября 2008

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

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

Давайте возьмем кусок и сохраним его в test1.txt:

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

Вот небольшой фрагмент кода Python:

>>> 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', '']

По сути, это даст вам кортеж [Столбец, Значение], который вы можете использовать для вставки данных в вашу базу данных (после экранирования всех строк и т. Д. И т. Д., Предупреждение об инъекции SQL).

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

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

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

Редактировать: Пока это в Python, C # / VB.net должен иметь такие же / похожие способности.

1 голос
/ 22 октября 2008
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
...