Что было бы лучшим способом для анализа этого файла?

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

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

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

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

PS. Я использую 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)

4 ответа

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

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

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

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

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

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

АДРЕС =              {Адрес места нахождения}
SUBURB=               {Местоположение Пригород}
СОСТОЯНИЕ = ххх
POSTCODE= ххх
ДЕПОЗИТНЫЙ ПЛАН № 0
РАЗДЕЛ И СТО № 0
СОБСТВЕННОСТЬ ТЕЛЕФОН НЕТ =

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

>>> f = open ("test1.txt", "r")
>>> l = f.readlines ()
>>> l = [line.split ('=') для строки в l]
>>> для строки в l:
    печатная строка

['ADDRESS', '{Адрес местонахождения}']
['SUBURB', '{Location Suburb}']
['STATE', 'XXX']
['POSTCODE', 'xxx']
['ДЕПОЗИТНЫЙ ПЛАН НЕТ', '0']
['РАЗДЕЛ И СТО НЕТ', '0']
['НЕДВИЖИМОСТЬ ТЕЛЕФОН НЕТ', '']

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

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

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

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

Изменить: хотя это в Python, C#/VB.net должны иметь такие же / аналогичные способности.

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
Другие вопросы по тегам