如图,B列为数据源,里面的内容为向个字符串,以逗号分隔,字符串的内容为日期和产品及重量,要求根据后面的日期列表,将产品和重量拆分到相对应的日期中去:公式如下:
=DROP(REDUCE("",B2:B5,LAMBDA(s,t,LET(
i,DROP(REDUCE("",TEXTSPLIT(t,,",",1),LAMBDA(x,y,LET(
m,TAKE(TEXTSPLIT(y,TEXTSPLIT(y,VSTACK(SEQUENCE(10)-1,"/"),,1),,1),,1),
VSTACK(x,HSTACK(m,TEXTSPLIT(y,m,,1)))))),1),
j,MONTH(C1:BJ1)&"/"&DAY(C1:BJ1)&" ",
VSTACK(s,MAP(SEQUENCE(,COLUMNS(C1:BJ1)),LAMBDA(a,LET(b,IF(ISNUMBER(FIND(INDEX(i,,1)&" ",j)),INDEX(i,,2),""),TEXTJOIN("",1,INDEX(b,,a))))))))),1)
公式思路:此例最适合的方式应该是拖动法,为了展示lambda函数一次性完成输入的特点,特使用lamda公式法求解:
=DROP( REDUCE( "", B2:B5,#将每个单元格字符串进行遍历LAMBDA(s, t, LET(i, DROP( REDUCE( "", TEXTSPLIT(t, , ",", 1), 将字符串进行分行 LAMBDA(x, y, LET(
#将字符串再次分列m, TAKE( TEXTSPLIT( y, TEXTSPLIT( y, VSTACK( SEQUENCE(1 0) - 1, "/" ),1 ), , 1 ), , 1 ),#
#形成日期与内容的对应二维表VSTACK( x, HSTACK(m, TEXTSPLIT(y, m, , 1)))))),1),
#将日期变为与i对应的文本格式,加空格以区分单数日双数日j, MONTH(C1:BJ1) & "/" & DAY(C1:BJ1) & " ",VSTACK( s,#与日期匹配形成几列数据
MAP( SEQUENCE(, COLUMNS(C1:BJ1)), LAMBDA(a, LET(b, IF( ISNUMBER( FIND(INDEX(i, , 1) & " ", j) ),INDEX(i, , 2), "" ),TEXTJOIN("", 1, INDEX(b, , a))#将几列数据合并成一列)))
)))),1)
公式整体由两部分组成,
一是拆分B列,形成一个由日期和内容构成的表格(变量i);然后将日期列转变成与拆分出的日期相同格式的数据列(变量j)。
二是将数据查找后按日期列填充到相对应的单元格中(变量b)。变量b形成的单元格根据的i的行数进行拆分,因此也有多行,这时候就使用map函数按列将数据合并成一行。,当然reduce、byrow函数也可以。
评论 (0)