百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Metabase学习教程提问-7

toyiye 2024-06-21 12:39 16 浏览 0 评论

清理和格式化文本

如何使用自定义的文本,清理非结构化或不一致的文本。

假设Metabase想为我们可爱的社区举办一个晚宴。对于主菜,我们有牛肉炖牛肉或鹰嘴豆炖菜,而对于两侧,我们有印度菜或烤蔬菜。我们已经发送了一份关于菜单选项的调查,这样每个人都可以告诉我们他们想吃什么。

不幸的是,我们忘记在表单上设置数据验证,因此响应如下所示:

Response ID | Main | Side |

|-------------|-------------------------------------|-------------------------|

| 1 | beef tibs | injera |

| 2 | chickpea stew | grilled vegetables |

| 3 | BEEF TIBS WITH CHICKPEA STEW PLEASE | |

| 4 | | Grilled Vegetables |

| 5 | Surprise me. | |

我们希望:

1. 整理并结合主食和副食,这样我们就可以数出最受欢迎的饭菜了。

2. 处理在某些方面无效的响应(例如多个电源,或者菜单上不存在的电源)。

3. 跟踪提交了缺少信息的回复的客人。

总的来说,我们希望最终得到一个如下所示的表(向右滚动可查看完整的表):

Response ID | Main | Side | Order | Follow up? |

|-------------|-------------------------------------|-------------------------|---------------------------------------|------------|

| 1 | beef tibs | injera | beef tibs with injera | no |

| 2 | chickpea stew | grilled vegetables | chickpea stew with grilled vegetables | no |

| 3 | BEEF TIBS WITH CHICKPEA STEW PLEASE | | beef tibs only | yes |

| 4 | | Grilled Vegetables | grilled vegetables only | yes |

| 5 | Surprise me. | | | yes |

搜索和提取文本

我们假设唯一有效的主要选择是牛肉和鹰嘴豆炖菜。我们可以使用https://translate.baiducontent.com/transpage?cb=translateCallback&ie=utf8&source=url&query=%2Fdocs%2Flatest%2Fquestions%2Fquery-builder%2Fexpressions%2Fregexextract&from=en&to=zh&token=&monLang=zhregexextract函数检查每个响应中的有效菜单选项。

在中搜索值“牛肉tibs”专栏,我们将创建一个自定义列使用regex模式(?i)(beef tibs)。此regex模式执行不区分大小写的检查,以查看“beef tibs”是否出现在响应中的任何位置。

创建牛肉自定义列使用:

regexextract([Main], "(?i)(beef tibs)")

您应该得到输出:

| Response ID | Main | Beef |

|-------------|-------------------------------------|-----------|

| 1 | beef tibs | beef tibs |

| 2 | chickpea stew | |

| 3 | BEEF TIBS WITH CHICKPEA STEW PLEASE | BEEF TIBS |

| 4 | | |

| 5 | Surprise me. | |

然后,我们要搜索有效值“鹰嘴豆炖菜”列。

创建鹰嘴豆列:

regexextract([Main], "(?i)(chickpea stew)")

通过输出:

| Response ID | Main | Chickpea |

|-------------|-------------------------------------|---------------|

| 1 | beef tibs | |

| 2 | chickpea stew | chickpea stew |

| 3 | BEEF TIBS WITH CHICKPEA STEW PLEASE | CHICKPEA STEW |

| 4 | | |

| 5 | Surprise me. | |

合并来自不同列的值

接下来,我们将创建一个名为主(干净)这将合并每个客人的响应的有效干线。我们想建立一些逻辑如果包含:

  • 一个有效的选择(牛肉或鹰嘴豆炖),然后填充主(干净)有这个选择。
  • 多个有效选项,然后将第一个(最左边)有效选项放入主(干净).
  • 没有有效选项,然后填充主(干净)具有空值(空字符串)。

创造主(干净),我们将使用 href="https://translate.baiducontent.com/transpage?cb=translateCallback&ie=utf8&source=url&query=%2Fdocs%2Flatest%2Fquestions%2Fquery-builder%2Fexpressions%2Fcoalesce&from=en&to=zh&token=&monLang=zh">凝聚功能来处理上面列出的三个案例,然后把整个事情包装成 href="https://translate.baiducontent.com/transpage?cb=translateCallback&ie=utf8&source=url&query=%2Fdocs%2Flatest%2Fquestions%2Fquery-builder%2Fexpressions-list%23lower&from=en&to=zh&token=&monLang=zh">降低功能以小写标准化所有内容。

lower(coalesce([Beef],[Chickpea],""))

这将给出输出(向右滚动可查看完整的表):

| Response ID | Main | Beef | Chickpea | Main (Clean) |

|-------------|-------------------------------------|-----------|---------------|----------------|

| 1 | beef tibs | beef tibs | | beef tibs |

| 2 | chickpea stew | | chickpea stew | chickpea stew |

| 3 | BEEF TIBS WITH CHICKPEA STEW PLEASE | BEEF TIBS | CHICKPEA STEW | beef tibs |

| 4 | | | | |

| 5 | Surprise me. | | | |

我们来处理侧面列的方式与列。首先,使用regexextract函数从中搜索并返回有效值side列。

regexextract([Side], "(?i)injera")

创建Vegetables 自定义列:

regexextract([Side], "(?i)(grilled vegetables)")

要获得输出:

| Response ID | Side | Injera | Vegetables |

|-------------|--------------------|--------|--------------------|

| 1 | injera | injera | |

| 2 | grilled vegetables | | grilled vegetables |

| 3 | | | |

| 4 | Grilled Vegetables | | Grilled Vegetables |

| 5 | | | |

然后,使用https://translate.baiducontent.com/transpage?cb=translateCallback&ie=utf8&source=url&query=%2Fdocs%2Flatest%2Fquestions%2Fquery-builder%2Fexpressions%2Fcoalesce&from=en&to=zh&token=&monLang=zh"https://translate.baiducontent.com/transpage?cb=translateCallback&ie=utf8&source=url&query=%2Fdocs%2Flatest%2Fquestions%2Fquery-builder%2Fexpressions%2Fcoalesce&from=en&to=zh&token=&monLang=zh">coalesce 函数 和ef="https://translate.baiducontent.com/transpage?cb=translateCallback&ie=utf8&source=url&query=%2Fdocs%2Flatest%2Fquestions%2Fquery-builder%2Fexpressions-list%23lower&from=en&to=zh&token=&monLang=zh">lower函数要处理人们放置了部分、多个或没有有效side选项的情况,并将所有值转换为小写:

创建side(clean)自定义列:

lower(coalesce([Injera],[Vegetables], ""))

得到

Response ID | Side | Injera | Vegetables | Side (Clean) |

|-------------|--------------------|--------|--------------------|--------------------|

| 1 | injera | injera | | injera |

| 2 | grilled vegetables | | grilled vegetables | grilled vegetables |

| 3 | | | | |

| 4 | Grilled Vegetables | | Grilled Vegetables | grilled vegetables |

| 5 | | | | |

组合来自不同列的值

最后,我们希望通过检查每个场景来生成完整的订单:

  • 如果主(干净)侧面(干净)两者都包含一个有效的选项,然后返回“main with side”。
  • 如果只有一个有效选项,则返回“main only”或“side only”。
  • 如果没有有效的选项,请将订单留空(返回空字符串)。

要检查列是否为非空,我们将使用https://translate.baiducontent.com/transpage?cb=translateCallback&ie=utf8&source=url&query=%2Fdocs%2Flatest%2Fquestions%2Fquery-builder%2Fexpressions%2Fisempty&from=en&to=zh&token=&monLang=zh="https://translate.baiducontent.com/transpage?cb=translateCallback&ie=utf8&source=url&query=%2Fdocs%2Flatest%2Fquestions%2Fquery-builder%2Fexpressions%2Fisempty&from=en&to=zh&token=&monLang=zh">isempty函数.

例如,检查Main(clean)为空:

isempty([Main (Clean)])

检查是否Main(clean)Side(clean)二者都blank,可以使用以及:

isempty([Main (Clean)]) AND isempty([Side (Clean)])

isempty目前只在另一个函数中工作,所以我们需要把每一张支票放在case函数。我们暂时将占位符文本作为输出:

case(

(isempty([Main (Clean)]) AND isempty([Side (Clean)])), "",

isempty([Side (Clean)]), "main only",

isempty([Main (Clean)]), "side only",

"main with side"

)

请注意,Case的顺序很重要,因为:

  • 这个case函数按顺序计算每个表达式,并在第一找到有效案例。
  • 如果将第一个大小写替换为第二个大小写,表达式将确认这一点side(clean)为空并立即返回“main only”,而不必检查是否main(clean)也是空的。

最后,为了填写每位客人的最终订单,我们将使用concat函数将值从main(clean)side(clean)其他单词(包括空格)。

创建命令使用列:

case(

(isempty([Main (Clean)]) AND isempty([Side (Clean)])), "",

isempty([Side (Clean)]), concat([Main (Clean)], " only"),

isempty([Main (Clean)]), concat([Side (Clean)], " only"),

concat([Main (Clean)], " with ", [Side (Clean)])

)

总的来说,这将为我们提供一组如下格式的列(向右滚动可查看完整的表):

| Response ID | Main | Side | Main (Clean) | Side (Clean) | Order |

|-------------|-------------------------------------|--------------------|-----------------|--------------------|---------------------------------------|

| 1 | beef tibs | injera | beef tibs | injera | beef tibs with injera |

| 2 | chickpea stew | grilled vegetables | chickpea stew | grilled vegetables | chickpea stew with grilled vegetables |

| 3 | BEEF TIBS WITH CHICKPEA STEW PLEASE | | beef tibs | | beef tibs only |

| 4 | | Grilled Vegetables | | grilled vegetables | grilled vegetables only |

| 5 | Surprise me. | | | | |

用空白值标记行

假设我们要添加一个名为跟进?跟踪缺少有效主、一个边或两者的订单。这意味着我们需要检查Order, Main (Clean), 或者 Side (Clean) 是空白的。

我们可以把="https://translate.baiducontent.com/transpage?cb=translateCallback&ie=utf8&source=url&query=%2Fdocs%2Flatest%2Fquestions%2Fquery-builder%2Fexpressions%2Fisempty&from=en&to=zh&token=&monLang=zh">isempty功能和或者 operator如果三列中的任何一列为空,则返回“yes”;如果所有列都用有效数据填充,则返回“no”。

创建跟进?使用:

case(( isempty([Order])
    OR isempty([Main (Clean)])
    OR isempty([Side (Clean)])), "yes", "no")
最终结果(向右滚动可查看完整表格):
| Response ID | Main                                | Side                    | Order                                 | Follow up? |
|-------------|-------------------------------------|-------------------------|---------------------------------------|------------|
| 1           | beef tibs                           | injera                  | beef tibs with injera                 | no         |
| 2           | chickpea stew                       | grilled vegetables      | chickpea stew with grilled vegetables | no         |
| 3           | BEEF TIBS WITH CHICKPEA STEW PLEASE |                         | beef tibs                             | yes        |
| 4           |                                     | vegetables              | grilled vegetables                    | yes        |
| 5           | Surprise me.                        |                         |              

最佳实践和技巧

在本教程中,每次需要提取、组合或标记文本数据时,我们都会创建一个新的自定义列。我们还结合了更简单的函数(例如lowerisempty)其他功能。通常,我们建议每次使用带有多个参数的函数时创建一个新的自定义列(例如case,regexextractcoalesce),因为:

  • 您可以确认表达式是否按预期工作。
  • 逻辑更容易阅读和更新。

如果您习惯于使用其他工具(如SQL、电子表格或Python)中的函数,请查看相关功能自定义表达式文档中的部分。例如,您可以学习如何使用case的相关函数.

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码