регулярное выражение Python для извлечения деталей столбца из ddl - PullRequest
0 голосов
/ 11 февраля 2019
USE test_db2
CREATE  TABLE test_table2
(
    Subscn_Purch_Id                 BIGINT COMMENT 'from deserializer',
    Price_Amt                       DECIMAL(38,18),           
    Purch_Line_Item_Id              BIGINT,  
    Subscn_Purch_Status_Id          BIGINT COMMENT 'from defdf',
    Offer_Coupon_Id                 BIGINT,    -- INTRO OFFER
    Offer_Period_Hrs                BIGINT,
    discount_offer_id               STRING     -- DISCOUNT
)
PARTITIONED BY ( 
testcol bigint
)
ROW FORMAT SERDE 
  'eeee' 
STORED AS INPUTFORMAT 
  'rrrr' 
OUTPUTFORMAT 
  'tttt';

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

Мне не нужны детали комментария, такие как '- INTRO OFFER'и «- СКИДКА» в приведенном выше примере.

Я пытался использовать регулярное выражение

\s*(\w+)\s*(\w+)(?:\s*\,\s*)?(?:\((\d+)(?:,\s?(\d+))?\))?(?:\s*\,\s*)?(?:(?=(?:.*COMMENT\s*)\'(.*)\'(?:\,|\))))

. Это регулярное выражение извлекает детали, в которых есть слово «COMEMNT», но не другие. При добавлении «?»в конце этого регулярного выражения он извлекает детали, которые мне не нужны.

как этого добиться.

присоединение ссылки regex101:

https://regex101.com/r/QfOCfj/3

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

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

SELECT
    COLNO,
    SYSTEM_COLUMN_NAME,
    DATA_TYPE, 
    COALESCE(PRECISION, LENGTH) AS length,
    SMALLINT(SCALE) AS scale,
    STORAGE
FROM QSYS2/SYSCOLUMNS
WHERE
    SYSTEM_TABLE_SCHEMA = 'your_db' AND
    SYSTEM_TABLE_NAME   = 'test_table2';
0 голосов
/ 11 февраля 2019

Как правило, не рекомендуется разбирать эти строки с помощью регулярных выражений.При этом вы можете попробовать использовать более новый модуль regex, который поддерживает \G:

(?:\G(?!\A)|\()
\s*
(?P<column_name>\w+)\s+
(?P<column_type>\w+)
(?:
    \(
    (?P<column_size>[^()]+)
    \)
)?
[, ]+
.*

См. демонстрацию на regex101.com иобратите внимание на модификаторы.


В качестве альтернативы - если установка другого модуля невозможна - используйте два выражения:
  1. Извлекайте каждый блок ( и ) сначала рекурсивно
  2. Анализируйте этот блок с помощьюВышеупомянутое выражение минус первая строка
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...