提问人:WOTEVER 提问时间:3/16/2023 最后编辑:WarcupineWOTEVER 更新时间:8/11/2023 访问量:444
Excel:使用公式从字符串中提取 n 个数字的序列
Excel: Extract a sequence of n numbers from a string with a formula
问:
我在 excel 中有一个单元格,其中包含一个我需要提取的 6 位数字。该单元格可能包含刺痛或其他数字,但幸运的是没有其他 6 位数字。(间距、字数、位置编号可能会有所不同) 有没有办法只提取那个 6 位数字?
如果必须是一个公式,我不能为此使用 VBA
单元格 A1 | 单元格 B1 |
---|---|
ab 12 abcd 1234 abcdef 123456 abcdefgh 12345678 | 123456 |
答:
如果函数可用,则可以测试以下内容。这有点啰嗦。在最新版本的 Excel 中,也可以使用,可以进一步减少它。LET
TEXTSPLIT
=LOOKUP(10^6,LET(x,TRIM(MID(SUBSTITUTE(" "&A2," ",REPT(" ",99)),99*SEQUENCE(LEN(A2)-LEN(SUBSTITUTE(A2," ",""))+1),99)),IF(LEN(x)=6,IF(ISNUMBER(x+0),x+0,"a"),"a")))
评论
ab 12 abcd 1234 abcdef 1234567 abcdefgh 123456
123456
OP123456 6859
123456
如果序列前后总是有一个空格:
=TEXTJOIN(" , ",TRUE,IF(LEN(TEXTSPLIT(A2," "))=6*ISNUMBER(VALUE(TEXTSPLIT(A2," "))),TEXTSPLIT(A2," "),""))
评论
测试解析的子字符串中的每个字符的数字性更安全。否则,可能会不合理地返回子字符串(如 2-june 或 1.2E04)。
=LET(
ζ,TEXTSPLIT(A1," "),
FILTER(ζ,(LEN(ζ)=6)*MMULT(SEQUENCE(,6,,0),1-ISERR(0+MID(ζ,SEQUENCE(6),1)))=6)
)
也就是说,以下内容也应该足够严格:
=LET(ζ,TEXTSPLIT(A1," "),FILTER(ζ,(LEN(ζ)=6)*(1-ISERR(0+(ζ&"**0")))))
尽管后者将返回小数,例如前者不会。1.2345
评论
TEXTSPLIT
" "
""
" "
"**0"
A1
"**0"
"E0"
"E"
"E0"
"**0"
"**0"
"12-june"
"12-june**0"
"1.2E04"
我建议使用 .尝试-FILTERXML()
=FILTERXML("<t><s>"&SUBSTITUTE(A1," ","</s><s>")&"</s></t>","//s[string-length()=6][number()=.]")
"<t><s>"&SUBSTITUTE(A1," ","</s><s>")&"</s></t>"
将构造一个有效的 XML 字符串以通过 FILTERXML() 公式进行处理。- XPath 参数 //s 将返回所有节点,其中仅过滤 6 位节点,并且仅返回数字值。
[string-length()=6]
[number()=.]
评论
您可以尝试以下操作:
=LET(A,A2, s,6, n,TEXTSPLIT(A,TEXTSPLIT(A,CHAR(ROW(48:57)),,1)),
FILTER(n, LEN(n)=s))
这个想法取自 @JvdV 对这个问题的回答:只连接大写字母?。如果要将结果转换为数字,请将结果乘以 。我假设您正在寻找自然数,对于任何其他类型的数字,公式需要调整或采取不同的方法。FILTER
1
由于@VBasic2008,可以使用代替 和 来实现更短的公式和更易于理解的公式:SEQUENCE
CHAR
ROW
=LET(A,A2, s,6, n,TEXTSPLIT(A,TEXTSPLIT(A,SEQUENCE(10,,0),,1)),
FILTER(n, LEN(n)=s))
如果有多个数字满足该条件,它将返回多行。您可以将它们组合在一行中,用 将 () 的输出括起来。FILTER
f
TEXTJOIN(",",,f)
评论
SEQUENCE
CHAR(ROW(48:57))
SEQUENCE(10,,0)
SEQUENCE
评论