我有一列包含ABCDP2S6_EFGHP2Te6_X_YY.Y_ZZZ内容的单元格我想使用公式命令输出CDABP2S6-GHEFP2Te6我在谷歌上搜索了一下,似乎涉及到替换和查找,但找不到一个正确的方法来做。有什么帮助吗?
ABCDP2S6_EFGHP2Te6_X_YY.Y_ZZZ
CDABP2S6-GHEFP2Te6
nlejzf6q1#
您可以尝试,假设输入中的每个值的长度与您的注解相同:
B1中的公式:
B1
=CONCAT(MID("-"&A1,{4,2,6,1,13,11,15},{2,2,4,1,2,2,5}))
这里我简单地使用整数数组来获取长度为1、2、4或5个字符的子串。为了避免一个有点冗长的公式和重复使用MID(),第一步是在输入中添加一个前导连字符,我们也可以在索引中引用它。这将简单地将所有其他字符向右移动一个;因此它们在输入中的相应位置也将改变。根据documentation,第二个参数应该告诉函数一个起始位置,而第三个参数将告诉函数从给定的起始位置开始的子字符串的长度。因此,您可以查看两个元素对的数组。因此,第一个数组中的每个索引在第二个数组中的相同索引处都有对应的索引:
MID()
如果这不能描绘出一幅清晰的画面,只需跳过我们使用前导连字符的部分,并像这样使用原始输入:
=CONCAT(MID(A1,{3,1,5},{2,2,4}),"-",MID(A1,{12,10,14},{2,2,5}))
如果这还不够简单,那么写出每个单独的开始位置,每次提取一个字符:
=CONCAT(MID(A1,{3,4,1,2,5,6,7,8},1),"-",MID(A1,{12,13,10,11,14,15,16,17,18},1))
一个合理的替代方案是先TEXTPLIT()输入,然后应用相同的技巧,但这次是尾部有一个连字符:
TEXTPLIT()
=CONCAT(MID(TAKE(TEXTSPLIT(A1,,"_"),2)&"-",{3,1,5},{2,2,5}))
jfewjypa2#
使用TEXTBEFORE()函数。
TEXTBEFORE()
=TEXTBEFORE(A1,"_X")
对于旧版本,请使用-
=LEFT(A1,SEARCH("_X",A1)-1)
iqxoj9l93#
这里是另一种方法:
=LET(A,A1, split,INDEX(TEXTSPLIT(A,"_"),,{1,2}), REVERSE2, LAMBDA(x, TEXTJOIN("",,SORTBY(MID(x,{1,3},{2,2}),{2,1}))), TEXTJOIN("-",, BYCOL(split, LAMBDA(x,REVERSE2(LEFT(x,4)) & RIGHT(x,LEN(x)-4)))))
下面是输出:
首先,我们通过TEXTSPLIT进行拆分,并仅取前两列(split)。我们定义了一个用户LAMBDA函数,该函数将4字符串的顺序颠倒,并取2字符组,即REVERSE2("ABCD")返回"CDAB"。(x),以将REVERS2应用于第一个4字符,然后将结果与字符串的其余部分连接起来。最后,通过TEXTJOIN连接整个结果,并以-作为分隔符。这个逆过程可以推广到长度为2的倍数的字符串。定义以下user LAMBDA函数:
TEXTSPLIT
split
LAMBDA
4
2
REVERSE2("ABCD")
"CDAB"
x
REVERS2
TEXTJOIN
-
REVERSEBY2=LAMBDA(y,LET(n,LEN(y)/2,s,SEQUENCE(n),start,SEQUENCE(n,,,2), size, 2*s^0,TEXTJOIN("",,SORTBY(MID(y,start,size),IF(MOD(s,2)=0,s-1,s+1)))))
何处
IF(MOD(s,2)=0,s-1,s+1)
为排序条件构建逻辑例如:
REVERSEBY2("ABCDEFGH") -> CDABGHEF
更一般的情况是,对于长度为m的组和长度为n的字符串,并且n可被m整除,可以使用以下公式:
m
n
REVERSEBYM = LAMBDA(x, m,LET(n, LEN(x)/m, s,SEQUENCE(n), start,SEQUENCE(n,,,m), size, m*s^0, idx,SEQUENCE(n/m), order,DROP(REDUCE("",idx,LAMBDA(ac,z, VSTACK(ac,SORT(SMALL(s,SEQUENCE(m)+(z-1)*m),,-1)))),1), TEXTJOIN("", , SORTBY(MID(x,start,size),order))))
例如:n=18,m=3,则它会反转每组三个的顺序
n=18
m=3
=REVERSEBYM("123456789ABCDEFGHI",3) -> 789456123GHIDEFABC
3条答案
按热度按时间nlejzf6q1#
您可以尝试,假设输入中的每个值的长度与您的注解相同:
B1
中的公式:这里我简单地使用整数数组来获取长度为1、2、4或5个字符的子串。为了避免一个有点冗长的公式和重复使用
MID()
,第一步是在输入中添加一个前导连字符,我们也可以在索引中引用它。这将简单地将所有其他字符向右移动一个;因此它们在输入中的相应位置也将改变。根据documentation,第二个参数应该告诉函数一个起始位置,而第三个参数将告诉函数从给定的起始位置开始的子字符串的长度。因此,您可以查看两个元素对的数组。因此,第一个数组中的每个索引在第二个数组中的相同索引处都有对应的索引:
如果这不能描绘出一幅清晰的画面,只需跳过我们使用前导连字符的部分,并像这样使用原始输入:
如果这还不够简单,那么写出每个单独的开始位置,每次提取一个字符:
一个合理的替代方案是先
TEXTPLIT()
输入,然后应用相同的技巧,但这次是尾部有一个连字符:jfewjypa2#
使用
TEXTBEFORE()
函数。对于旧版本,请使用-
iqxoj9l93#
这里是另一种方法:
下面是输出:
首先,我们通过
TEXTSPLIT
进行拆分,并仅取前两列(split
)。我们定义了一个用户LAMBDA
函数,该函数将4
字符串的顺序颠倒,并取2
字符组,即REVERSE2("ABCD")
返回"CDAB"
。(x
),以将REVERS2
应用于第一个4
字符,然后将结果与字符串的其余部分连接起来。最后,通过TEXTJOIN
连接整个结果,并以-
作为分隔符。这个逆过程可以推广到长度为
2
的倍数的字符串。定义以下userLAMBDA
函数:何处
为排序条件构建逻辑
例如:
更一般的情况是,对于长度为
m
的组和长度为n
的字符串,并且n
可被m
整除,可以使用以下公式:例如:
n=18
,m=3
,则它会反转每组三个的顺序