根据列值查找相应的列名
例题描述和简单分析
某Excel在D1:I6片区的第1行是列名,其他行有些格为空,有些格有数据,有数据的格一定是连续的。如下所示:
A | B | C | D | E | F | G | H | I | |
1 | 4.5.2020 | 5.5.2020 | 6.5.2020 | 7.5.2020 | 8.5.2020 | 9.5.2020 | |||
2 | data | data | |||||||
3 | data | data | data | data | data | ||||
4 | data | data | data | data | data | ||||
5 | data | data | data | data | data | data | |||
6 | data | data | data | data |
现在要在A列和B列分别算出连续有数据的格的起始列的列名,以及终止列的列名。如下所示:
A | B | C | D | E | F | G | H | I | |
1 | start date | end date | 4.5.2020 | 5.5.2020 | 6.5.2020 | 7.5.2020 | 8.5.2020 | 9.5.2020 | |
2 | 4.5.2020 | 5.5.2020 | data | data | |||||
3 | 4.5.2020 | 8.5.2020 | data | data | data | data | data | ||
4 | 5.5.2020 | 9.5.2020 | data | data | data | data | data | ||
5 | 4.5.2020 | 9.5.2020 | data | data | data | data | data | data | |
6 | 6.5.2020 | 9.5.2020 | data | data | data | data |
上面算法涉及定位查询和按位置取数。
解法及简要说明
首先在 Excel 中选中 D1:I6, 复制到集算器脚本的 A1 格,然后编写如下脚本:
` | A |
1 | …(复制来的数据 ) |
2 | =A1.split@n("\t") |
3 | =A2.to(2,).new(~.pselect(~!=""):start,~.pselect@z(~!=""):end) |
4 | =A3.new(A2(1)(start):'start date',A2(1)(end):'end date') |
执行后,将A4的计算结果连同列名复制到Excel的A1格。
A2:将字符串解析成序列的序列
A3:取数据部分(从第2行开始),分别算出顺序第1个不为空的成员的位置,以及逆序第1个不为空的成员的位置。
A4:按位置从列名序列里中取数。
英文版