2013-07-27 4 views
1

Есть ли способ, чтобы разбить колонну на лексемы, и присоединиться к ним (как вы можете в других языках программирования, таких как Python, Java, Ruby)Postgres - как разделить и присоединиться?

У меня есть столбец с URL, такие как «http://www.Yahoo.com», и я хотите извлечь из него «Yahoo.com» (основной домен, а не субдомен). Адреса URL могут быть формы:

Я планирую использовать регулярные выражения, чтобы извлечь все после HTTP: // и перед следующей косой чертой. Затем разбиваем url на период (.), Затем соединяем последние 2 токена.

С регулярным выражением, я могу извлечь www.yahoo.com от http://www.yahoo.com. С помощью splits/joins я могу получить yahoo.com с сайта www.yahoo.com. Проблема в том, что я не знаю, как делать split/join с Postgres.

Кто-нибудь знает дорогу? Или лучше альтернатива?

ответ

3

Это не совсем подход вы просили, но они должны получить то, что вы хотите:

vinod=# select * from table; 
      url     
---------------------------------- 
http://www.domain.com 
http://domain.com 
http://domain.com/page/page1 
http://www.domain.com/page/page2 
http://www.domain.com/ 
(5 rows) 

vinod=# select substring(substring(url from 'http[s]*://([^/]+)') from '\w+\.\w+$') from table; 
substring 
------------ 
domain.com 
domain.com 
domain.com 
domain.com 
domain.com 
(5 rows) 

Внутренняя substring команда вытаскивает полный домен, а внешняя команда substring извлекает последние два фрагмента. Команды разделения и соединения Postgresql не так сильны, как в вашем среднем языке сценариев, поэтому я стараюсь делать такие вещи после того, как я вытащил вещи из БД, если можно.

0

Вы можете сопоставить их с \w+.[^.]+$

http://www.domain.com -> domain.com 
http://domain.com -> domain.com 
http://domain.com/page/page1 -> domain.com/page/page1 
http://www.domain.com/ -> domain.com/ 
http://www.domain.com/page/page2 -> domain.com/page/page2 
+0

Я хочу http://domain.com/page/page1 -> domain.com, хотя .. как я могу это сделать? –

+0

Тогда что-нибудь вроде 'select substring (подстрока (url from '(\ w + [.])? \ W + [.] \ W +') из '\ w + [.] \ W + $') из таблицы' –

0

Расщепление вещь в лексемы может быть достигнута довольно много способов:

  • regexp_split_to_table/regexp_split_to_array
  • string_to_array (для простых неподвижных расколов delimter)
  • Руководства substring экстракции или substring(... from 'pattern')
  • Полного текста поиск to_tsvector и to_tsquery
  • Процедурный lan Guage библиотеки, как библиотеки URL Perl или Python, Python + NLTK для обработки естественного языка и т.д.

В этом случае вы можете сделать свой URL-расщепление с помощью регулярного выражения, используя regexp_split_.... и это, вероятно, хорошо для многих применений - но, вероятно, не этот.Рассмотрим:

  • Мой домен, ringerc.id.au (что является "основной" домен)
  • www.ecu.edu.au ("основной" домен ecu.edu.au)
  • www.transperth.wa.gov.au ("основной" домен transperth.wa.gov.au)
  • tartarus.uwa.edu.au («основной» домен uwa.edu.au)

Удачи со всеми изменениями в национальном реестре и субиндикате с использованием регулярного выражения. Используйте правильный анализатор URL-адресов для извлечения домена, а затем соответствующую библиотеку, поддерживающую домен, чтобы определить, что такое «основной» домен для ваших целей. Я бы рекомендовал использовать plperl и the URL::Split или URI для начала. Или парсер URL-адреса любого поддерживаемого процедурного языка (Python, TCL, что угодно). Затем найдите подходящую библиотеку для этого языка, которая может идентифицировать домены и субдомены значимо в соответствии с критериями, которые вы хотите, и использовать их, а не просто полагаться на регулярное выражение.

При соединении вы так же есть много вариантов:

  • array_to_string
  • string_agg
  • Оператор || конкатенации
  • процедурного струнные языка операций и библиотеки

Для URL работы, снова Я бы предложил сделать это с помощью PL, который имеет собственную собственную библиотеку URL-адресов.

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