【问题标题】:How to split a 'search string' into parts, then check parts against a database如何将“搜索字符串”拆分为多个部分,然后根据数据库检查各个部分
【发布时间】:2022-11-19 07:03:58
【问题描述】:

这是我正在处理的事情:

  • 我们有一个机器数据库,它们的零件列表是使用字符串指定的。例如,一台机器可能用字符串 &XXX&YYY-ZZZ 指定,这意味着该机器包含部件 XXX 和 YYY 而不是 ZZZ。
  • 我们使用 &XXX 来指定某个部件存在于机器中,使用 -XXX 来指定某个部件不存在于机器中。
  • 也有可能某个部件未列出(即未指定它是否存在于机器中)。例如,我可能只有 &XXX&YYY(未指定 ZZZ)。
  • 此外,代码可以按任何顺序排列,例如我可能有 &XXX&YYY-ZZZ 或 &XXX-ZZZ&YYY。

为了搜索机器,我得到一个这样的字符串:'&XXX-YYY/&YYY&ZZZ'('/' 是一个 OR 运算符),意思是“我想找到所有机器 a) 包含 XXX 但不包含 YYY , 或 b) 同时包含 YYY 和 ZZZ。

我在基于变量排序解析字符串时遇到问题,部分可能不会显示,以及 / 运算符的处理。请注意,我们使用 Microsoft 365。

寻找一些建议!

当我搜索“&XXX-YYY/&YYY&ZZZ”时,我应该返回以下机器:

Machine Result
&XXX-YYY&ZZZ True (because XXX exists and YYY does not exist)
&XXX-YYY-ZZZ True (because XXX exists and YYY does not exist)
&XXX&YYY&ZZZ True (because YYY exists and ZZZ exists)
&XXX&ZZZ False (because YYY is specified in the search, but this machine doesn't specify it)
&ZZZ&YYY True (showing that parts can be in any order)

【问题讨论】:

  • 看起来你想在 Excel 中定义一个解析器,但它不是为此目的,有更适合构建这样一个解析器的工具/语言。如果是简单的事情是可以做到的。例如,我们可以考虑的token只有XXXYYYZZZ,如果没有,有没有什么模式可以识别它们?

标签: arrays excel string formula excel-365


【解决方案1】:

您可以在C2 单元格中尝试以下公式:

=LET(query, A2, queries, TEXTSPLIT(query, "/"), input, B2:B6,
  FIND_TOKENS, LAMBDA(x, DROP(TEXTSPLIT(x,, {"&","-"}),1)),
  FIND_OPE, LAMBDA(txt, tokens, MAP(tokens, LAMBDA(tk, LET(ope, 
    RIGHT(TEXTBEFORE(txt, tk),1), IF(ope="&", 1, IF(ope="-", 0, NA())))))),
  SPLIT, LAMBDA(x, LET(y, TEXTSPLIT(x, ",", ";"),HSTACK(INDEX(y,,1), 
    1*INDEX(y,,2)))),
  lkup, DROP(REDUCE("", queries, LAMBDA(acc, qry, VSTACK(acc, LET(tokens, 
    FIND_TOKENS(qry), ope, FIND_OPE(qry, tokens), TEXTJOIN(";",, tokens&","&ope)
    )))),1),
  MAP(input, LAMBDA(txt, LET(tokens, FIND_TOKENS(txt), ope, FIND_OPE(txt, tokens),
    out, REDUCE("", lkup, LAMBDA(acc, qry, LET(table, SPLIT(qry), qryTk, 
      INDEX(table,,1), qryOpe, INDEX(table,,2), opeFound, 
      FILTER(ope, ISNUMBER(XMATCH(tokens, qryTk)), -1), 
      matches, ROWS(opeFound),result, IF(matches <> ROWS(qryTk), 0, 
      IF(SUM(N(opeFound = qryOpe)) = matches, 1, 0)),
      IF(acc="", result, MAX(acc, result))
    ))), IF(out = 1, TRUE, FALSE)
  )))
)

这是相应的输出:

解释

待办的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    相关资源
    最近更新 更多