【问题标题】:Google sheets - Extract numbers with their units of measurment谷歌表格 - 提取带有测量单位的数字
【发布时间】:2021-11-17 17:07:31
【问题描述】:

我想要一个可以从文本中提取数字及其测量单位的函数。

例如在 A2 中我有:

这个箱子重5公斤,另一个箱子重10公斤。

所以我想要一个可以返回的函数:

5公斤10公斤

注意:我希望该函数适用于任何测量单位,而不仅仅是“kg”。

我是谷歌表格的初学者,所以如果你能给我提供一个工作功能,那将非常有帮助。

【问题讨论】:

  • 我建议您共享一个指向示例电子表格的链接,该示例电子表格至少有 20 行包含实际数据范围。围绕一个孤立的数据编写这样一个工作公式几乎是不可能的。
  • 分享您的工作表副本

标签: google-sheets google-sheets-formula


【解决方案1】:

您可以使用此示例自定义函数来提取以数字开头后跟一个字符/s 的单词。

/**
 * @customfunction
 */
function EXTRACTMEASUREMENT(input) {
  // match all words which starts with a number
  var result = input.match(/\d+[a-zA-Z]+\S*/g)
  // combine array into a string separated with spaces
  result = result.join(' ');
  // Remove special characters(except whitespace) in the string
  result = result.replace(/[^\/a-zA-Z0-9\s]/g, '')
  return result;
}

输出:

限制:

  • 无法检测到值和单位之间有空格的测量值。 (当10 kg. 中存在空间时,请参阅单元格A5 中的结果)
  • 无论数字后面的字符是否为有效单位,都将被提取。 (查看单元格 A5 中的结果,其中 20yy 不是有效的测量单位)
  • 如果您想免除不被删除的特定字符,您可以将它们添加到大括号[^\/a-zA-Z0-9\s] 中(例如/ 不会被删除)。 注意:

如果您可以列出应该支持的有效测量单位,这可以得到改进。

【讨论】:

  • 这个脚本对我有用!但是如果我输入一个单元格“300km/h”,它会提取“300kmh”而没有“/”。你能更新脚本让它也支持吗?
  • 我更新了答案以在结果中保留/
【解决方案2】:

试试

=arrayformula(substitute(transpose(query(flatten(split(
REGEXREPLACE(A1,"([0-9.,/]+[ ]{0,1}[a-z1-3/.\-""]+)","♣♦$1♣")
,"♣")),"select * where Col1 like '♦%' ")),"♦",""))

【讨论】:

    【解决方案3】:

    另一种选择:

    =ArrayFormula(IF(LEN(A:A),
      SPLIT(
       REGEXREPLACE(
        REGEXREPLACE(A:A,"("&
          REGEXREPLACE(
            REGEXREPLACE(
             REGEXREPLACE(A:A,"(\d+[.,/]*\d*(?:\w+|\s\w+)[\""./\-\w+]*)",""),
            "\s+\.","|\\."),
          "\s+","|")
        &")",""),
       "(\d)\s","$1")
     ," ",,1)
    ,))
    

    【讨论】:

    • 这似乎有效!但是如果单位是例如:“30km / h”它不会提取它只提取30km。如何在公式中解决这个问题?
    • @BegCoder 查看编辑。
    【解决方案4】:

    尝试:

    =INDEX(SPLIT(FLATTEN(QUERY(TRANSPOSE(IFERROR(SUBSTITUTE(
     REGEXEXTRACT(SPLIT(REGEXREPLACE(A1:A, "(\d+.\d+|\d+)", "×$1"), "×"), 
     TEXTJOIN("|", 1, {"\d+.\d+ ","\d+.\d+","\d+ ","\d+"}&
     SORT({"nm";"mm";"cm";"dm";"km";"m";"t";"kg";"dg";"g";"l";"ml";"dl"}, 
      LEN({"nm";"mm";"cm";"dm";"km";"m";"t";"kg";"dg";"g";"l";"ml";"dl"}), 0))), 
     " ", ))),,9^9)), " "))
    


    更新:

    一个单元格:

    =INDEX(TRIM(FLATTEN(QUERY(TRANSPOSE(IFERROR(SUBSTITUTE(
     REGEXEXTRACT(SPLIT(REGEXREPLACE(A1:A, "(\d+.\d+|\d+)", "×$1"), "×"), 
     TEXTJOIN("|", 1, {"\d+.\d+ ","\d+.\d+","\d+ ","\d+"}&
     SORT({"nm";"mm";"cm";"dm";"km";"m";"t";"kg";"dg";"g";"l";"ml";"dl"}, 
      LEN({"nm";"mm";"cm";"dm";"km";"m";"t";"kg";"dg";"g";"l";"ml";"dl"}), 0))), 
     " ", ))),,9^9))))
    

    【讨论】:

    • 你可以编辑这个函数但没有 SPLIT 吗?我希望在同一个单元格中返回所有数字。
    • @BegCoder 确定。答案已更新
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    相关资源
    最近更新 更多