Каков наилучший способ анализа поля адреса с использованием t-sql или SSIS? - PullRequest
0 голосов
/ 01 мая 2010

У меня есть набор данных, который я импортирую в таблицу SQL каждую ночь. Одно поле имеет адрес «Address_3» и содержит поля City, State, Zip и Country Однако эти данные не стандартизированы. Как лучше всего разобрать данные, которые в данный момент собираются в 1 поле, в отдельные поля. Вот несколько примеров данных, которые я мог бы получить:

'INDIANAPOLIS, IN 46268  US'
'INDIANAPOLIS, IN 46268-1234  US'
'INDIANAPOLIS, IN 46268-1234'
'INDIANAPOLIS, IN 46268'

Спасибо заранее! David

Ответы [ 4 ]

2 голосов
/ 01 мая 2010

Я сделал нечто подобное (не в T-SQL) и считаю, что лучше всего начинать с конца строки и работать в обратном направлении.

  • Возьмите самый правый элемент до первого пробела или запятой.
  • Это известный код страны? Это страна
  • Если нет, все ли это числа (включая дефис)? Это почтовый индекс.
  • Остальное откажитесь

Возьмите второй самый правый элемент до следующего пробела или запятой

  • Это поле из двух букв? Это состояние

Возьмите все остальное, предшествующее запятой, и назовите его городом.

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

Вы можете реализовать нечто подобное, используя функцию REVERSE , чтобы упростить поиск (в этом случае вы будете анализировать строку слева направо, а не справа налево, как я уже говорил выше), функции PATINDEX или CHARINDEX для поиска пробелов и запятых и функция SUBSTRING для разделения адреса на основе позиций, найденных PATINDEX и CHARINDEX. Вы можете использовать функцию ASCII , чтобы определить, является ли символ числовым или нет.

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

1 голос
/ 02 мая 2010

Безусловно, лучший способ - не изобретать велосипед и не получать механизм разбора и стандартизации адресов. В идеале вы должны использовать сертифицированный CASS механизм, который одобрен почтовой службой. Однако в наши дни в сети есть бесплатные анализаторы адресов, и любой из них будет более точным и менее расстраивающим, чем попытка разбора адреса самостоятельно.

При этом я скажу, что анализаторы адресов и почтовое отделение работают снизу вверх (Итак, страна, затем почтовый индекс, затем город, затем штат, затем строка адреса 2 и т. Д.).

0 голосов
/ 09 мая 2014

что-то вроде этого должно помочь:

select substring(CityStateZip, 1, 
case when charindex(',',reverse(CityStateZip)) = 0 then len(CityStateZip) 
else len(CityStateZip) - charindex(',',reverse(CityStateZip)) end) as City,
LEFT(LTRIM(
SUBSTRING(CityStateZip, case when charindex(',',reverse(CityStateZip)) = 0 then len(CityStateZip) else 
len(CityStateZip) - charindex(',',reverse(CityStateZip))+2 end, LEN(CityStateZip)))
,2) as State,

SUBSTRING(CityStateZip, case when charindex(' ',reverse(CityStateZip)) = 0 then len(CityStateZip) else 
len(CityStateZip) - charindex(' ',reverse(CityStateZip))+2 end, LEN(CityStateZip)) as Zip

from   YourAddressTable
0 голосов
/ 01 мая 2010

В SSIS вы можете иметь 4 производных столбца (город, штат, почтовый индекс, страна).

substring(column,1,FINDSTRING(",",column,1)-1)  --city
substring(column,FINDSTRING(" ",column,1)+1,FINDSTRING("",column,2)-1) --state
substring(column,FINDSTRING(" ",column,2)+1,FINDSTRING(" ",column,3)-1) -- zip

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

...