转换结构-一列转二维表(Excel函数集团)

一串转一列:

先来个最简单的,一串文字:“甲公司产品:鸽子玻璃糕、双色豆糕、蜜饯金枣、合意饼;乙公司产品:奶白葡萄、双色马蹄糕、合意饼;丙公司产品:蜜饯哈密杏、菠萝软糖、菠萝软糖、蜜饯荔枝、翠玉豆糕”,转成一列。

=TEXTSPLIT(A1,,{":","、",";"})

这就是TextSplit的基础用法,没啥好说的吧。

一串转二维表:

下面加大难度,转成一个二维表……好吧,其实还是没难度,只不过就是函数多加了点参数。

=TEXTSPLIT(A1,{":","、"},";",,,"")

一列转二维表(分分合合版):

下面真的增加难度了,一列转二维表,这有好几种思路,先来个分分合合的。

=TEXTSPLIT(CONCAT(IF(RIGHT(A3:A17)="品",";",",")&A3:A17),",",";",1,,"")

IF(RIGHT(A3:A17)="品",";",",")&A3:A17部分,如果最右一个字符是“品”就是分号,否则就是逗号,其实用什么号都可以,目的就是为了区分开来,毕竟一横一纵。

ConCat就是把分号或者逗号和A列的数据连接在一起,变成以下这个样子:

;甲公司产品,鸽子玻璃糕,双色豆糕,蜜饯金枣,合意饼;乙公司产品,奶白葡萄,双色马蹄糕,合意饼;丙公司产品,蜜饯哈密杏,菠萝软糖,菠萝软糖,蜜饯荔枝,翠玉豆糕

最后还用TextSplit横啊纵的拆分,参四1用来忽略空,参六空文本用来补足空处。

一列转二维表(BT版1):

下面,BT版来了……高能……

=IFNA(DROP(LET(a,SCAN(0,A3:A17,LAMBDA(x,y,x+(RIGHT(y)="品"))),REDUCE(1,UNIQUE(a),LAMBDA(x,y,VSTACK(x,TOROW(FILTER(A3:A17,a=y)))))),1),"")

先看“SCAN(0,A3:A17,LAMBDA(x,y,x+(RIGHT(y)="品")))”这一截:

当A列数据最后一个字是“品”时,这结果就是个True或False,换个说法就是1和0,用Scan一个一个累加,有“品”了就加1,没“品”就加0,最后得出的结果是甲公司所有都是1,从乙公司开始变成2,丙公司开始变成3。

其实这结果和“COUNTIF(OFFSET(A3,,,ROW(1:15)),"*品")”一样,就是“{1;1;1;1;1;2;2;2;2;3;3;3;3;3;3}”,但为了让公式整体BT^2,就这么用了。

再来看“REDUCE(1,UNIQUE(a),LAMBDA(x,y,VSTACK(x,TOROW(FILTER(A3:A17,a=y)))))”这一截:

a就是上述Scan的结果,y是Unique(a),自然就只剩下了1、2、3。

Filter的筛选,正常公式a=y结果会出错,但是在Reduce里就没问题,这是一个折腾:

第一次折腾a等于1,筛选出来的结果就是甲公司的数据,再用Torow给拉成一行,和x纵向堆叠,x在上这堆在下,组成的就是下一次运算的x

第二次折腾a等于2,筛选出乙公司的再被拉成一行,和x堆叠,组成再下次运算的x

第三次折腾a等于3……

好了吧,给张图说明:

 最后的Drop和Ifna都是为了把不相干的东东去掉。

一列转二维表(超级BT版):

好了,超级BT版来了……

=IFNA(DROP(REDUCE("",A3:A17,LAMBDA(x,y,IF(RIGHT(y)="品",VSTACK(x,y),VSTACK(DROP(x,-1),HSTACK(TOROW(TAKE(x,-1),2),y))))),1),"")

这个……要怎么说清楚呢?算了,还是先上图:

每一次的运算过程是先判断y是不是有“品”,如果有“品”就直接和x进行堆叠,x在上y在下;如果没“品”……

还是堆叠,不过在上的是去掉最后一行的x,在下的是……

留着最后一行的x,好吧,如果就是这样那折腾得也太没意义了,关键是这个x还要再和y进行一个横向的堆叠,x在左y在右……

就这么堆叠着堆叠着,就来到了第二个“品”(第六次运算),这一堆叠“乙公司产品”后面具体的还没叠上去,全是错误值,要是再进行运算堆叠,岂不是要堆叠出一堆错误值?所以用一个Torow,第二个参数用2或者3,把错误值生生给挤了出去。

然后,就可以继续愉快地堆叠了……

好吧,今天先BT到这儿,散会! 

posted @ 2023-10-29 16:39  熬肥妖  阅读(32)  评论(0编辑  收藏  举报