2014-07-25 4 views
0

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

Данные выглядит следующим образом:

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

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

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

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

если «заголовок: $», а затем захватить следующие строки до следующего «* .:» не читается и grab «heading: value» и Если строка начинается с номера, предположим, заголовок «телефон» и , если строка содержит список с разделителями косой черты, предположите заголовок «функции» до «--------...»

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

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

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

ответ

0

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

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

# 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+):(.*)/ 

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

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

Смежные вопросы