【问题标题】:Intercapitalization in Standard Sql with exceptions标准 Sql 中的大写转换,但有例外
【发布时间】:2019-12-04 16:03:44
【问题描述】:

我有要大写的字符串列表。

到目前为止,我做到了


CREATE TEMP FUNCTION INTERCAPS(my_text STRING)

AS (

(

SELECT

STRING_AGG(

CONCAT(UPPER(SUBSTR(list, 1, 1)), LOWER(SUBSTR(list, 2))),

' ' ORDER BY placement

)

FROM UNNEST(SPLIT(my_text, ' ')) as list WITH OFFSET placement

)

);

WITH test_data AS (

SELECT '8th avenue' AS my_text 

UNION ALL

SELECT '88 VALLEY Stream JiMMy Lee BRIDGE' AS my_text

UNION ALL 

SELECT "hen And HEN'S ROAD" AS my_text

UNION ALL 

SELECT 'Water of Leith BRIDGE' AS my_text

UNION ALL 

SELECT 'Anne McLean DRIVE' AS my_text

UNION ALL 

SELECT "John O'Groats ROAD" AS my_text

UNION ALL 

SELECT 'Bowlers Creek (MacKenzies) BRIDGE' AS my_text

UNION ALL 

SELECT 'Clutha RIVER (Luggate) BRIDGE - (mini park) Bridge' AS my_text

UNION ALL 

SELECT "Cross ROAD (O'Neill ROAD)" AS my_text

)

//

SELECT my_text, INTERCAPS(my_text) as formatted

FROM test_data

GROUP BY my_text, formatted

;

在格式化第 3 行 - 第 9 行数据时需要帮助。

Current and Expected Output

我的文本

第八大道

88 VALLEY Stream 吉米李桥

母鸡和母鸡的路

利斯桥之水

安妮麦克莱恩大道

约翰·奥格罗茨路

Bowlers Creek (MacKenzies) 桥

Clutha RIVER (Luggate) BRIDGE - (mini park) Bridge

十字路口(奥尼尔路)

格式化

第八大道

88 谷溪吉米李桥

母鸡之路

利斯桥之水

安妮麦克林大道

约翰·奥格罗茨路

Bowlers Creek (mackenzies) 桥

Clutha River (luggate) Bridge - (mini Park) Bridge

十字路口(奥尼尔路)

预期输出

8th Avenue

88 Valley Stream Jimmy Lee Bridge

Hen and Hen's Road

Water of Leith Bridge

Anne McLean Drive

John O'Groats Road

Bowlers Creek (MacKenzies) Bridge

Clutha River (Luggate) Bridge - (Mini Park) Bridge

Cross Road (O'Neill Road)

基本规则:

起始字母和“空格”之后的每个字母都必须大写。

但是不想格式化像“and”/“of”这样的连词。在我的数据集中,McLean & Mclean 是唯一的名称,所以不想混用它们。

我正在考虑使用 regexp_replace

r'\(.'

在 ( 格式化后的第一个字母大写

r'Mac.|Mc.'

仅当 regexp_match Mac[A-Z] 在原始文本中将格式化的大写,但无法掌握它。


从 UNNEST(REGEXP_EXTRACT_ALL("xyz and McLean and MacKenzies", r'Mac.|Mc.')) 中选择匹配作为与 OFFSET 作为位置 ORDER BY 位置的匹配;

---- 希望这能进一步帮助。

提前非常感谢:)

【问题讨论】:

  • 这里有很多问题。 1. 规则是什么?是什么让And 变成and,但hen 变成Hen?我们如何确定如何将a 添加到McKenzies?我们如何将JiMMy 的大小写改为Jimmy 而不是McLean 的大小写为Mclean
  • 基本规则:开头字母和“空格”之后的每个字母都必须大写。但是不想格式化像“and”/“of”这样的连词。在我的数据集中,McLean & Mclean 是唯一的名称,所以不想混用它们。我正在考虑将 regexp_replace 用于 ** r'(.' ** 为大写和 ** r'Mac.|Mc.' ** 为大写,仅当 regexp_match Mac[A-Z] 在原始文本中但无法掌握---- _ 从 UNNEST(REGEXP_EXTRACT_ALL("xyz and McLean and MacKenzies", r'Mac.|Mc.')) 中选择匹配与偏移作为位置 ORDER BY 位置匹配;_ ---- 希望这有帮助.
  • 你能用你上次 cmet 的信息更新你的问题吗?这对阅读您的问题的任何人都有用。
  • 已更新。谢谢你的收获:)

标签: regex google-bigquery


【解决方案1】:

您可以使用以下 Bigquery 函数将字符串转换为您需要的格式

CREATE TEMPORARY FUNCTION capitalize(str STRING)
RETURNS STRING
LANGUAGE js AS """
  str = str.toLowerCase();
  return str.replace(
      /\\b(?!and\\s|of\\s)\\b\\S+/g,
      function(txt) {
          return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
      }
  );
""";

例如,您可以使用此查询对其进行测试

Select capitalize(text) from (Select "hen And HEN'S ROAD" as text) 

你会得到下一个输出

Hen and Hen's Road

【讨论】:

  • 感谢 ebeltran。 +1 用于 JS 功能。话虽如此,我不想添加 JS 代码,我仍在为 Mac 单词苦苦挣扎......
  • 您能否提供一个更具体的 Mac 单词示例?目前尚不清楚这种情况下的预期输出是什么,以及为什么在您的用例中使用带有 JS 的 Bigquery 函数无效?
  • 当使用字符串“paul McLean & Mclean”时,你想得到“Paul McLean & Mclean”?
  • 示例- McLean Drive 和 Mcbeth Lane 是我的数据集中的两个唯一条目,因此希望相应地保留格式,但在每个空格后大写剩余。并不是说 JS 无效。我对javascript一无所知,所以我很难解释所使用的代码。
  • 对于字符串“paul McLean & mclean”的预期输出是“Paul McLean & Mclean”
猜你喜欢
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
  • 2023-04-11
  • 2011-04-05
  • 2014-02-19
  • 1970-01-01
  • 2020-06-10
  • 2017-08-26
相关资源
最近更新 更多