Импорт слабо структурированных данных в базу данных

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

Данные выглядят так:

--------------------------------
blah:
foo
bar
lorum: ipsum
dolor: sit
foo: bar
bar: foo
123-555-1212
Lorum / Ipsum / Dolor / Sit
Foo / Bar
--------------------------------

Как вы можете видеть, есть некоторые заголовки полей, такие как "бла", "lorum" и т. Д., Но в некоторых данных отсутствует заголовок, например номер телефона или список с разделителями-косыми чертами. И некоторые заголовки находятся на одной линии, а другие нет.

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

Так что я думаю, что для синтаксического анализа нужно иметь как минимум 3 способа анализа данных, например:

если "заголовок:$", то захватывать следующие строки до тех пор, пока не будет прочитано следующее "*.:", и захватить "заголовок: значение", а если строка начинается с числа, принять заголовок "телефон", а если строка содержит список с разделителями слэшей, предположить заголовок " функции "до"--------..."

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

Я полагаю, что Perl может быть хорошим для этого, но очень плохо Perl Foo.

Даже не знаю, с чего начать.

1 ответ

Вы всегда должны предполагать что-то в своем тексте, в противном случае у вас есть упражнение в НЛП.

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

 # split the text into records:
 @records = split /\n-----------------\n/, $text;
 # this will find lines that have another key/value pair after it
 qr/\A(\w+):(.*?)(?=\n\w+:)/ms

 # then the last key/value, that probably must be one line:
 qr/^(\w+):(.*)/

Я рекомендую каждый раз, после успешного сопоставления, удалять сопоставленный текст и продолжать.

Другие полезные предположения: телефонный номер может появиться в записи только один раз (и не как часть другого ключа / значения), который теги имеют в конце.

Другие вопросы по тегам