举例
下面的 Excel 中,Block 相同的行属于同一组。
Block | Bench |
4 | 1 |
5 | 1 |
6 | 1 |
4 | 8 |
5 | 8 |
6 | 8 |
4 | 9 |
5 | 9 |
6 | 9 |
4 | 5 |
5 | 5 |
6 | 5 |
目标:计算出 2 个新列,BenchAbove 为同一组内的上一行的 Bench,如果本行为第 1 行,则 BenchAbove 为空。BenchBelow 为同一组内的下一行的 Bench,如果本行为最后 1 行,则 BenchBelow 为空。结果如下:
Block | Bench | BenchAbove | BenchBelow |
4 | 1 | 8 | |
5 | 1 | 8 | |
6 | 1 | 8 | |
4 | 8 | 1 | 9 |
5 | 8 | 1 | 9 |
6 | 8 | 1 | 9 |
4 | 9 | 8 | 5 |
5 | 9 | 8 | 5 |
6 | 9 | 8 | 5 |
4 | 5 | 9 | |
5 | 5 | 9 | |
6 | 5 | 9 |
这类问题的难点是:在不改变行顺序的前提下,获取同一组内的上一行下一行。
编写 SPL 脚本:
A | |
1 | =file("data.xlsx").xlsimport@t() |
2 | =A1.derive(~[:-1].select@1z(Block==A2.Block).Bench:BenchAbove, ~[1:].select@1(Block==A2.Block).Bench:BenchBelow) |
3 | =file("result.xlsx").xlsexport@(A2) |
A1 读取 Excel 数据
A2 获取相邻行,~[:-1] 获取当前行之前的所有行,~[1:] 则是当前行之后的所有行,select 用于查找,@z 表示从后往前找,@1 表示找到 1 条就结束。
A3 结果导出至 result.xlsx