Excel 文件 xlsx 格式的游标问题

Excel 的 xlsx 文件可以用游标读取,但在 IDE 里和 excel 插件里使用时,都存在一点小问题。我总结了三种用法,希望 SPL 大佬们帮忙看一下,问题出在哪里。且不管这些写法的实战意义,纯粹是为了学习过程中的解惑。场景如下,SPL 主目录下有一个简单的 test.xlsx 文件,只有两列 51 行,第一列的列名叫类型,值是整数 1 到 51,第二列的列名和对应的值随意。先用游标的方式读取,然后,根据类型用游标的方式分成 6 组,分别是 1-10 一组,11-20 一组,21-30,31-40,41-40,51,最后用索引为文件名输出成 csv 格式至主目录下。

第一种方法:游标分组 cursor.group@i

IDE 里的写法如下:

A
1 =file("test.xlsx").xlsimport@ct()
2 //=A1.group@i(类型 %10==1).fetch()
3 =A1.group@i(类型 %10==1).(file(#/".csv").export@ct(~))
上述语句中 A2 只是为了展示分组结果, 运行后的结果分成了 6 组,结果如下:

imagepng
A3 在执行时已经注释了 A2,但输出结果时没有成功,主目录下并没有生成对应的 6 个 csv 文件。

如果把这 3 句语句复制粘贴至 excel 插件中去执行,情况正好相反,A2 中的语句在 excel 中显示为空,但 A3 只能输出 5 个对应的 csv 文件,少了第一组文件,文件内容被最后一组的内容给覆盖了。如果用 skip 函数去统计行数时,第一个文件的行数显示的是最后一个文件的行数,这是游标到了最后又游回到了开始的地方,继续执行?这有点迷惑。

第二种方法: 自定义区间段,用游标分段读取

IDE 里的写法如下:

A B
1 ["1:10","12:20","22:30","32:40","42:50","52:"]
2 for A1 =file("test.xlsx").xlsimport@c(;,${A2})
3 =file(#A2/".csv").export@ct(B2)
这个方法虽然能输出 6 个 csv, 但存在两个问题:

第一,上一个区间的结尾跟下一个区间的开始处,要隔开 2,才能正常地连续,比如 1-10,12-20…。如果只相隔 1,就会有重复,比如 1-10,11-20,那第 10 条记录会出现两次;

第二,这种方法读取的时候不能带表头,带表头 xlsimport@tc 时,第一组是正常的,从第二组开始没有正常的表头,第一行变成了表头。

这种方法在 excel 插件里使用时也是同样的问题。另外,用 fork 并行,也用这个方法分段游标获取时,跟上述方法存在同样的问题。问题会不会是因为 xlsimport@c(;, 分段) 这个方法有问题?

第三个方法: 循环游标,固定长度。这个方法没有问题,无论是表头还是连续程度都无问题。

IDE 里的写法如下:

A B
1 =file("test.xlsx").xlsimport@ct()
2 for A1,10 =file(#A2/".csv").export@ct(A2)

这个方法在 excel 插件里使用也能获取正确的分组结果。