1.1 文本文件
1.1.1 结构化文本文件
结构化文本的格式比较规范,即每行一条数据,列之间用分隔符区分。SPL 可用 import/export 函数读写结构化文本。
比如:ordersNT.txt 存储订单信息,列之间用制表符 tab 分隔,业务意义依次为:订单 ID、客户编号、销售 ID、订单金额、订单日期。部分数据如下:
26 TAS 1 2142.4 2009-08-05
33 DSGC 1 613.2 2009-08-14
84 GC 1 88.5 2009-10-16
133 HU 1 1419.8 2010-12-12
32 JFS 3 468.0 2009-08-13
39 NR 3 3016.0 2010-08-21
43 KT 3 2169.0 2009-08-27
…
将该表按客户编号的字母顺序从小到大的排序,相同的客户编号再按订单金额从大到小排序,最后保持原格式存入新文件。部分结果应当如下:
136 ARO 25 899.0 2009-12-16
16 BDR 27 2464.8 2009-07-23
81 BDR 29 1168.0 2010-10-14
108 BDR 12 480.0 2010-11-15
139 BDR 30 166.0 2010-12-18
93 BON 6 2564.4 2010-10-29
106 BSF 27 10741.6 2009-11-13
…
SPL 脚本:
A | |
---|---|
1 | =file(“D:/data/ordersNT.txt”).import() |
2 | =A1.sort(_2,-_4) |
3 | =file(“D:/data/ordersNT_sort.txt”).export(A2) |
A1、A3: 读入、写出结构化文本文件。
A2:函数 sort 进行排序,_2 和 _4 分别代表第 2 列和第 4 列,默认按顺序排序,负号代表逆序。
SPL 也可以处理带 列名(标题) 的文本文件。比如 orders.txt 的第 1 行为列名,部分数据如下:
OrderID Client SellerId Amount OrderDate
26 TAS 1 2142.4 2009-08-05
33 DSGC 1 613.2 2009-08-14
84 GC 1 88.5 2009-10-16
133 HU 1 1419.8 2010-12-12
32 JFS 3 468.0 2009-08-13
39 NR 3 3016.0 2010-08-21
43 KT 3 2169.0 2009-08-27
…
同样对该文件进行排序,结果带列名写入新文件:
A | |
---|---|
1 | =file(“D:/data/orders.txt”).import@t() |
2 | =A1.sort(Client,-Amount) |
3 | =file(“D:/data/orders_sort.txt”).export@t(A2) |
A1、A3:选项 @t 表示带列名读入、写出文本文件。
A2:用列名而不是序号进行排序。
函数 import/export 默认的分隔符是 tab,选项 @c 表示以逗号为分隔符(常用于 csv 文件)。如果遇到其他特殊分隔符,SPL 同样可以处理。
比如 orders_semi.txt 以 || 为分隔符:
A | |
---|---|
1 | =file(“D:/data/orders_semi.txt”).import@t(;,“||”) |
2 | =A1.select(Amount>=1000 && Amount<2010) |
3 | =file(“D:/data/orders_semi_select.txt”).export@t(A2;“||”) |
函数 export 默认的功能是将数据写入新文件,或覆盖同名文件,但有时候我们需要在原文件后面追加结构相同的新数据,这种情况使用 @a 选项:
=file("D:/data/orders_semi_select.txt").export@at(A2;"||")
1.1.2 字符串序列
有些文本文件的格式不规范,不能直接进行结构化计算,但可以读为字符串序列。这样的半结构化数据格式繁多,下面用多行数据举例,说明 SPL 读写字符串序列的一般方法。
文件 3lines.txt 中每 3 行的前 2 行对应一条数据,第 3 行无用,部分数据如下:
26 TAS 1 2142.4
2009-08-05
some comment
33 DSGC 1 613.2
2009-08-14
some comment
27 TAS 1 2142.4
2009-08-05
some comment
去掉文件中的无用行,结果写入新文件:
A | |
---|---|
1 | =file(“D:/data/3lines.txt”).read@n() |
2 | =A1.step(3,1,2) |
3 | =file(“D:/3lines_reuslt.txt”).write(A5) |
A1:读入文本文件。@n 表示按行读成序列,序列的每个成员对应一行。
A2:对序列 A1 每隔 3 个成员取第 1 个成员和第 2 个成员。
A3:将序列写入文本文件,序列的每个成员对应一行。