在excel中从字符串中提取字母数字或数字子串

dl5txlt9  于 2023-03-20  发布在  其他
关注(0)|答案(4)|浏览(213)

我是第一次接触excel,这个逻辑对我来说似乎很坚韧,
我有一个文本在一个单元格中为ex - '这是一个测试字符串和代码:6676 RtA 01“,我需要提取此文件-6676 RtA 01
逻辑-我需要提取字母数字或数字代码,出现在imeediate字代码/代码忽略任何特殊字符,空格或下划线,括号等
单词code/codes应区分大小写,如果发现多个代码,则应使用“;“这里有几个前-

  • '测试字符串',输出-空白
  • “另一个测试字符串CODE”6657 Yuyt 9和代码:9989 ′,产量6657元/万吨;9989
  • '带代码括号(代码A011261)',输出- A011261
eh57zj3b

eh57zj3b1#

严格地说,我认为您需要忽略字符串中可能出现的所有非字母数字字符,同时保留所需提取的大小写:

=LET(
    ζ,A1,
    ξ,LAMBDA(α,β,CHAR(SEQUENCE(α,,β))),
    γ,VSTACK(ξ(10,48),ξ(26,65),ξ(26,97)),
    δ,TEXTSPLIT(ζ,γ,,1),
    ε,TEXTSPLIT(ζ,δ),
    κ,DROP(ε,,1),
    λ,SEQUENCE(10),
    TEXTJOIN(";",,
        FILTER(κ,
            (1-ISNA(XMATCH(DROP(ε,,-1),"code"&{"","s"})))
            *MMULT(TOROW(λ),1-ISERR(FIND(λ-1,κ))),
        "")
    )
)
  • 感谢DavidLeal纠正 *。
az31mfrm

az31mfrm2#

根据您的示例,您可以使用以下内容:

=IFERROR(TEXTJOIN(";",TRUE,FILTERXML("<a><b>"&SUBSTITUTE(TRIM(SUBSTITUTE(SUBSTITUTE(LOWER(A1),")"," "),")"," "))," ","</b><b>")&"</b></a>","//b[contains(preceding::*[1],'code') and translate(.,'1234567890','')!=.]")),"")

我可以想象有更简单的方法......:)

dwbf0jvd

dwbf0jvd3#

我的努力是:

=LET(
CharList, MID(C2,SEQUENCE(LEN(C2)),1),
TEXTJOIN(";",TRUE,DROP(CHOOSECOLS(TEXTSPLIT(CONCAT(FILTER(CharList, ISNUMBER(FIND(UPPER(CharList),"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 "))))," ", "code",,1),2),1))
)

我不知道这是否比@Rory的答案简单(由于不知道XML过滤,我不理解),它只短了10个字符。

0x6upsns

0x6upsns4#

这里有另一种办法,它考虑到评注中所述的补充规则:* 代码至少有一个数字 *。此方法可防止任何误报,而误报将SEARCH/FIND用作解决方案的一部分时会产生。例如,对于以下字符串:codeine A10 is not a code A20将只返回A20

=LET(A, A1, set, CHAR(VSTACK(ROW($48:$57),ROW($65:$90), ROW($97:$122))),
 stxt, TEXTSPLIT(A, TEXTSPLIT(A,set,,1)), xm, XMATCH(stxt, {"code","codes"}), 
 idx, FILTER(SEQUENCE(,COLUMNS(xm))+1,1-ISNA(xm)), codes, INDEX(stxt,idx), 
 isCode, BYCOL(1-ISERR(FIND(SEQUENCE(10),codes)), LAMBDA(x, MAX(x))),
 TEXTJOIN(",",,FILTER(codes, isCode,"")))

使用TEXTSPLIT(A, TEXTSPLIT(set,,1)拆分和删除不需要的字符的想法我从@jvdV提供的答案中获得了这个想法,并将其应用到以下问题中:Concatenate only upper case letters?。一旦我们有了信息拆分(stxt),您就可以使用XMACHT来查找codecodes的列索引。
一旦我们有了标记位置(xm),候选代码就在下面的列中,名称idx可以找到相应的列,有了这些列,我们就可以从stxt通过INDEX找到候选代码(codes)。
现在我们需要检查codes是否有效(isCode),即至少一个数字。我们使用BYCOL并搜索数字BYCOL的输入是10xm的数组,其中m是候选项codes的编号。如果找到编号,则在给定行位置返回1,否则0。按列使用MAX将生成需要通过FILTER过滤的布尔数组。最后,我们通过TEXTJOIN将结果用逗号分隔。
前面的逻辑可以 Package 在用户LAMBDA函数GET_CODES中,因此我们可以生成如下的数组版本:

=LET(A,A1:A6,GET_CODES,LAMBDA(x,LET(set,CHAR(VSTACK(ROW(48:57),ROW(65:90),
 ROW(97:122))), stxt,TEXTSPLIT(x,TEXTSPLIT(x,set,,1)),
 xm,XMATCH(stxt,{"code","codes"}),
 idx,FILTER(SEQUENCE(,COLUMNS(xm))+1,1-ISNA(xm)), codes, INDEX(stxt,idx),
 isCode, BYCOL(1-ISERR(FIND(SEQUENCE(10),codes)),LAMBDA(x, MAX(x))),
 TEXTJOIN(",",,FILTER(codes, isCode,"")))), BYROW(A, LAMBDA(x, GET_CODES(x))))

以下是使用GET_CODES时的输出:x1c 0d1x如您所见:

  • 3正确识别bracket不是有效代码
  • 4仅正确标识A02,因为对于A01,标记不是code/codes。测试它不会生成误报。
  • 56返回空,因为字符串中没有有效代码

相关问题