【问题标题】:regex for an array output数组输出的正则表达式
【发布时间】:2021-10-22 09:46:21
【问题描述】:

您好,我在其中一个画面行中有一个箭头输出。如何使用正则表达式将其缩短为另一个计算字段。

样本 1 行有 2 个项目:

[{self=https://blah.blahblah.com/rest/api/2/component/1111, id=1111, name=abc, description=123}, {self=https://blah.blahblah.com/rest/api/2/component/123456, id=123456, name=wow, description=so cool}]

需要输出:

name=abc and description=123, name=wow and description=so cool

将在画面中使用 REGEXP_EXTRACT

编辑:我也可以尝试在 redshift/athena 中通过 sql 在它进入 tableau 之前执行它。

【问题讨论】:

    标签: sql regex amazon-web-services amazon-redshift tableau-desktop


    【解决方案1】:

    使用 tableau 计算字段和正则表达式可以实现所需的输出,但它太脆弱了,如果您的数据具有比示例中更灵活/嵌套的结构,则它的可扩展性不那么强。

    REGEXP_EXTRACT([C1],'((name)=[aA-zZ0-9 ]+)') 
    + ' and '
    + REGEXP_EXTRACT([C1],'((description)=[aA-zZ0-9 ]+)')
    + ' , ' 
    + REGEXP_EXTRACT_NTH([C1],'(\,\W+\{)([aA-zZ0-9 \n\/"=:.,]+)(name=[aA-zZ0-9 ]+)',3)
    + ' and ' 
    + REGEXP_EXTRACT_NTH([C1],'(\,\W+\{)([aA-zZ0-9 \n\/"=:.,]+)(description=[aA-zZ0-9 ]+)',3)
    

    您的数据来源是什么?如果您可以打包成有效的 JSON,您可以使用 Redshift JSON_EXTRACT_ARRAY_ELEMENT_TEXTJSON_EXTRACT_PATH_TEXT 函数在提供数据之前准备数据。


    更新

    有了足够的IFs 并在正则表达式中重复,您几乎可以实现任何目标但要付出什么代价

    REGEXP_EXTRACT([C1],'((name)=[aA-zZ0-9 \-]+)') 
    + ' and '
    + REGEXP_EXTRACT([C1],'((description)=[aA-zZ0-9 \-]+)') 
    
    + 
    IF ISNULL(REGEXP_EXTRACT_NTH([C1],'(\,\W+\{)([aA-zZ0-9 \n\/"=:.,]+)(name=[aA-zZ0-9 \-]+)',3))
    THEN ''
    ELSE ' , ' 
        + REGEXP_EXTRACT_NTH([C1],'(\,\W+\{)([aA-zZ0-9 \n\/"=:.,]+)(name=[aA-zZ0-9 \-]+)',3)
        + ' and ' 
        + REGEXP_EXTRACT_NTH([C1],'(\,\W+\{)([aA-zZ0-9 \n\/"=:.,]+)(description=[aA-zZ0-9 \-]+)',3)
    END 
    
    +
    IF ISNULL(REGEXP_EXTRACT_NTH([C1], '(\,\W+\{[aA-zZ0-9 \n\/"=:.,\}]+\,\W+\{[aA-zZ0-9 \n\/"=:.,]+)(description=[aA-zZ0-9 \-]+)', 2))
    THEN ''
    ELSE ', ' + REGEXP_EXTRACT_NTH([C1], '(\,\W+\{[aA-zZ0-9 \n\/"=:.,\}]+\,\W+\{[aA-zZ0-9 \n\/"=:.,]+)(name=[aA-zZ0-9 \-]+)', 2) 
        + ' and ' + REGEXP_EXTRACT_NTH([C1], '(\,\W+\{[aA-zZ0-9 \n\/"=:.,\}]+\,\W+\{[aA-zZ0-9 \n\/"=:.,]+)(description=[aA-zZ0-9 \-]+)', 2)
    END 
    
    +
    IF ISNULL(REGEXP_EXTRACT_NTH([C1], '(\,\W+\{[aA-zZ0-9 \n\/"=:.,\}]+\,\W+\{[aA-zZ0-9 \n\/"=:.,]+)(\W+\{[aA-zZ0-9 \n\/"=:.,]+)(description=[aA-zZ0-9 \-]+)', 3))
    THEN ''
    ELSE ', ' + REGEXP_EXTRACT_NTH([C1], '(\,\W+\{[aA-zZ0-9 \n\/"=:.,\}]+\,\W+\{[aA-zZ0-9 \n\/"=:.,]+)(\W+\{[aA-zZ0-9 \n\/"=:.,]+)(name=[aA-zZ0-9 \-]+)', 3)
        + ' and ' + REGEXP_EXTRACT_NTH([C1], '(\,\W+\{[aA-zZ0-9 \n\/"=:.,\}]+\,\W+\{[aA-zZ0-9 \n\/"=:.,]+)(\W+\{[aA-zZ0-9 \n\/"=:.,]+)(description=[aA-zZ0-9 \-]+)', 3)
    END
    
    +
    IF ISNULL(REGEXP_EXTRACT_NTH([C1], '(\,\W+\{[aA-zZ0-9 \n\/"=:.,\}]+\,\W+\{[aA-zZ0-9 \n\/"=:.,]+)(\W+\{[aA-zZ0-9 \n\/"=:.,\}]+\,\W+\{[aA-zZ0-9 \n\/"=:.,]+)(description=[aA-zZ0-9 \-]+)', 3))
    THEN ''
    ELSE ', ' + REGEXP_EXTRACT_NTH([C1], '(\,\W+\{[aA-zZ0-9 \n\/"=:.,\}]+\,\W+\{[aA-zZ0-9 \n\/"=:.,]+)(\W+\{[aA-zZ0-9 \n\/"=:.,\}]+\,\W+\{[aA-zZ0-9 \n\/"=:.,]+)(name=[aA-zZ0-9 \-]+)', 3)
        + ' and ' + REGEXP_EXTRACT_NTH([C1], '(\,\W+\{[aA-zZ0-9 \n\/"=:.,\}]+\,\W+\{[aA-zZ0-9 \n\/"=:.,]+)(\W+\{[aA-zZ0-9 \n\/"=:.,\}]+\,\W+\{[aA-zZ0-9 \n\/"=:.,]+)(description=[aA-zZ0-9 \-]+)', 3)
    END
    

    【讨论】:

    • 您好 Pavel,感谢您的回复。当有 2 个 Url 时有效,但不适用于 1 个 Url。有没有办法添加一个计数器/if 语句来捕获多达 5 个 url?来源是雅典娜/红移。在画面中它看起来就像一个字符串
    • @msulol 我认为更新的计算可以满足您的需求,但这绝对是我做过的最糟糕的事情之一 :) 强烈不建议在生产中使用它。考虑在画面之前进行一些预处理。也许是一些简单的数据清理脚本
    • 谢谢,这解决了 95% 的问题,是否可以合并破折号和空格?例如:name=abc- Web, description=null or name=Project Tracking, description=null or name=Project-based Business, description=null
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多