Импорт слабо структурированных данных в базу данных
Я получаю ежедневные потоки данных с данными, которые только слабо структурированы. Мне нужно импортировать его в базу данных, чтобы я мог запустить отчет, который находит новые записи и изменения существующих записей.
Данные выглядят так:
--------------------------------
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+):(.*)/
Я рекомендую каждый раз, после успешного сопоставления, удалять сопоставленный текст и продолжать.
Другие полезные предположения: телефонный номер может появиться в записи только один раз (и не как часть другого ключа / значения), который теги имеют в конце.