举例
下面的 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
这篇博客介绍了如何使用SPL脚本来处理Excel数据,特别是针对Block相同行的数据组,计算同一组内上一行(BenchAbove)和下一行(BenchBelow)的Bench值。在不改变行顺序的情况下,通过衍生新列实现了这一目标,适用于需要分析和关联相邻数据的场景。
686

被折叠的 条评论
为什么被折叠?



