转换结构-一列转二维表(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到这儿,散会!