excel函数技巧:2次reduce+1次map+textsplit将数据拆分到日期中-趣帮office教程网

如图,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函数也可以。