База данных с несоответствиями - PullRequest
0 голосов
/ 23 января 2011

(я использую SQLite3)

В моей таблице есть поля типа

Name
Zipcode
State
City
State
StreetAddress

Проблема в том, что в поле имени люди вводили данные, которые были неправильно отформатированы

Например,

Name (single column)
====================
John Smith MD
Jason Young M.D
Charlie Horse MD.
Kim Powell PH.d
Sandy Fox Phd M.D.

Я хочу очистить MD, чтобы сохранить его как M.D. и Phd / PH.d как PhD (пожалуйста, помните, что имя - 1 поле).

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

Может кто-нибудь объяснить, что я могу сделать для форматирования данных? Я мог бы сделать это вручную, но это заняло бы слишком много времени!

Ответы [ 6 ]

2 голосов
/ 23 января 2011

Вы можете попробовать использовать Google Refine (бесплатная загружаемая программа) http://code.google.com/p/google-refine/ Отлично подходит для всех видов очистки данных ...

2 голосов
/ 23 января 2011

Вы не должны просто принимать данные из пользовательского интерфейса и немедленно сохранять их в базе данных без проверки и очистки.Вы также защищены от внедрения SQL-кода.

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

1 голос
/ 23 января 2011

Для адреса вы можете проверить его по базе данных адресов вашего региона / страны.

Я хочу очистить MD, чтобы сохранить его как M.D., а Phd / PH.d - как PHd (помните, что имя - 1 поле).

Найдите все варианты MD и PHD и запустите серию обновлений (функция замены) :

update tbl set name = replace(name, 'M.D.', 'MD')
update tbl set name = replace(name, 'MD.', 'MD')
update tbl set name = replace(name, 'M.D', 'MD')
update tbl set name = replace(name, 'M.D', 'MD')
update tbl set name = replace(name, ' MD', ' MD')  -- fix case, hope no name starts with "MD"
update tbl set name = replace(name, 'PHD', 'PhD')  -- fix case
update tbl set name = replace(name, 'PH.D', 'PhD')  -- fix case
update tbl set name = replace(name, 'PH-D', 'PhD')  -- fix case
etc for any other variants you can think of or encounter

Уличный адрес также имеет проблемы, такие как несколько пробелов между словами вместо 1

Заменить два пробела на один, несколько раз .. после удаления разрывов строки. Чтобы быстрее свернуть ряд пробелов, мы используем 8-> 1 дважды, затем 4-> 1, затем 2-> 1

update tbl set address = replace(address, '\r', ' ')
update tbl set address = replace(address, '\n', ' ')
update tbl set address = replace(address, '        ', ' ')
update tbl set address = replace(address, '        ', ' ')
update tbl set address = replace(address, '    ', ' ')
update tbl set address = replace(address, '    ', ' ')
update tbl set address = replace(address, '  ', ' ')
update tbl set address = replace(address, '  ', ' ')
1 голос
/ 23 января 2011

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

Простой алгоритм:

1) Разделить имя на пробелы

2) отбросить пустые значенияэто результаты двух или более пробелов

3) Возьмите каждое значение, преобразуйте его в верхний регистр, удалите точки, тире или что-нибудь еще и найдите его в таблице известных суффиксов, таких как «MD»,«PHD» и замените его нужным значением.

4) На шаге 3 все, что не соответствует, оставьте как есть

Очевидно, что для этого требуется составить список известныхсуффиксы, такие как MD и т. д. Это не так уж плохо.Большие профессиональные пакеты, которые делают это в Direct Marketing, обрабатывают это таким образом.

5) Перекомбинируйте результирующие значения

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

В добавление к этому Даффи советует здраво.

0 голосов
/ 27 января 2012

Регулярные выражения и строковые операции могут работать для конечных подмножеств адресных данных, но в индустрии адресов существует множество исключительных случаев. USPS - это орган власти (по крайней мере, для адресов США), так почему бы не использовать службу, сертифицированную с USPS?

Для адресов, попробуйте эту службу пакетной обработки:

http://www.smartystreets.com/products/cass-certified-scrubbing

SmartyStreets также предлагает API с бесплатной подпиской для пользователей с низким уровнем использования. Я являюсь разработчиком программного обеспечения на SmartyStreets и помогал с обоими этими услугами.

0 голосов
/ 23 января 2011

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

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