SPL 函数参考
大约 6 分钟
SPL 函数参考
序表
fname
fname():根据字段序号取得序表中的字段名称。
语法
T.fname(i) -- 从序表T中取得字段序号为i的字段名称,无参数则返回T中所有字段名。参数
T -- 序表。 i -- 字段序号。示例
=A1.fname() =A1.fname(2)
array
array():序表转序列
语法
r.array(Fi,…) -- 依次取得记录r中Fi对应的字段值,省略Fi则取所有字段值并返回成序列参数
r --- 记录。 Fi --- 字段名。示例
=A1(1).array() =A1(1).array(STUDENTID,SCORE)
run
P.run():针对排列中每条记录计算表达式。
A.run():针对序列/排列中每个成员计算表达式,返回原序列。
语法
A.run(x) --- 仅计算一个表达式。 A.run(x1,x2, ......xi) --- 计算多个表达式。 A.run(xi:Fi,…) -- 针对序列/排列A中每个成员计算表达式xi,计算过程中可能对A修改,最后返回修改后的A。例如x为col1=col2+1,结果将修改col1字段值参数
P/A --- 序列/排列。 x --- 计算表达式,一般为字段名,或者由字段名组成的合法表达式,可使用"~"引用当前记录。 xi --- Fi的字段新值。 Fi --- A的字段名。选项
@m --- 数据量大的复杂运算中并行计算提升性能,计算次序不确定。 @z --- 逆向计算,仅适用于非纯序列。示例
=A2.run(Age+10:Age) =A5.run@m(MANAGER=A4.select@1(EID==A5.MANAGER).NAME)
文件
file
从本地文件读取数据
import
import():从本地文件导入数据
语法
f.import() f.import(Fi:type:fmt,…;k:n,s) -- 从文本文件f中读取n段中的第k段数据,Fi为读出的字段,缺省读出所有字段。 -- s为自选分隔符,缺省分隔符是tab。 -- 在分段读取时,会自动调整位置使读取到的整条内容读入记录,同时会保证读取时数据的连续性,避免出现重复或遗漏。参数
f -- 文件。 Fi -- 读出的字段,缺省读出所有,用#时表示用序号定位。 type -- 字段类型,包括:bool、int、long、float、decimal、string、date、time和datetime,缺省使用第一行数据类型。type为整数时表示排号键,排号数据目前只允许使用16个字节。 fmt -- 日期时间格式。 k -- 分段号。 n --- 总段数。k和n都省略时表示读全文件。 s -- 自选分隔符,缺省默认分隔符是tab。省略参数s时,s前边的逗号可以省略。选项
@t -- f中第一行记录作为字段名,不使用本选项就使用_1,_2,…作为字段名,Fi是#i时仍保持原列名。 @e -- Fi在文件中不存在时将生成null,缺省将报错。 @m -- 多线程取数,加快读取文件速度。结果集次序不确定,有k:n参数时忽略该选项。常用于从大文件取数。配置信息中并行数需大于1。@o时可能错,有k:n参数时也是这样。 @c -- s缺省时用逗号分隔。 @r -- 先读成串再解析,避免某些字符集的错误,使用该选项速度会慢。示例
// 逗号分隔csv文件 =file("D:\\Desktop\\emp.csv").import@tc() =file("D:\\Desktop\\emp.csv").import@t(;,",")
可能由于字符集的问题,导致在网络中导入Excel时造成乱码,可以尝试用xlsimport函数
T
T(): 根据文件扩展名读出文件内容,返回成序表
语法
T(fn:A,Fi,…;s) -- 根据文件fn的扩展名称读出文件内容,结果返回序表。fn支持的文件类型包括txt/csv/xls/xlsx/btx/ctx。参数
fn --- 数据文件。 A --- 排列/游标,参数可省略。 Fi --- 数据文件中的列标题,也可以用#1,#2,…表示第1列,第2列,…;参数可省略。 s --- 当fn是文本时,s为分隔符;当fn是xls或者xlsx时,s为sheet名,sheet名称不允许超过31个字符,并且不能包含特殊字符[]:/\?*。参数可省略。选项
@b --- 文件内容中无标题,缺省认为有标题。 @c --- 将文件内容读成游标。示例
=T("D:\City.txt") =T("D:\City.txt",CityName) =T("D:\City.txt",#2,#3) // 读取City.txt 文件中的第2列、第3列 =T("D:/users.txt";",") // 读取users.txt文件内容,文件中以逗号作为分隔符 =T("D:/user-a.txt":A6) // 将user-a.txt文件中的内容清空,然后将A6中的内容写入user-a.txt中
httpfile
// 远程文件
=httpfile("http://minio.botuer.cn/test/upload/test-spl.cvs")
可能由于字符集的问题,导致在网络中得到的文件流导入Excel时造成乱码,可以尝试用xlsimport函数
=httpfile("http://minio.botuer.cn/test/upload/test-spl.cvs").xlsimport@t()
关联合并
merge
merge():归并计算,将多个序表/排列合并。
语法
A.merge(xi,…) -- 按照字段xi有序归并 -- xi省略且A(i)无主键或者A(i)无序时,必须使用@o选项,仅简单合并参数
A --- 结构相同的多个序表/排列组成的序列。 xi --- 字段名,如果是按照多字段合并,字段间用逗号分隔,例如:x1,x2...。xi缺省为A(i)的主键。选项
@u --- 去掉重复的成员 @i --- 取交集归并 @d --- 第一个与后面的取差集。 @o --- 不使用归并计算仅简单合并。 @0 --- null排最后。 @x --- 不同成员组成的序表/序列。示例
pjoin
pjoin():通过关联键连接多个序表/排列
语法
A.pjoin(K:..,x:F,…;Ai:z,Ki:…,xi:Fi,…; …) -- 根据关联键连接,返回x:F,…与xi:Fi,…组成的序列,x:F,…缺省为A的所有列。 -- A和Ai是一对多时,xi是聚合表达式。 -- A和Ai是多对一时,Ai的记录将重复。参数
A --- 序表/排列。 K --- A中的关联键。 x --- A的计算表达式。 F --- 表达式x的字段名称。 Ai --- 序表/排列。 z --- 连接方式。z只能是省略或者为null。z省略时为内连接;z为null时为左连接,z为null且xi:Fi全部省略时仅保留匹配不上的A的记录 Ki --- Ai中的关联键。 xi --- Ai的计算表达式。 Fi --- 表达式xi的字段名称。选项
@o --- 有序,用归并。 @f --- full join,忽略后面的z参数。示例
=A1.pjoin(ProductID;A2,ID,Name) =A1.pjoin(ProductID,OrderID,Customer,OrderDate,SellerId,Amount;A2,ID,Name)
数据库
MySQL
=connect("com.mysql.jdbc.Driver","jdbc:mysql://127.0.0.1:3306/logistics_2900?user=root&password=root")
类比SQL数据操作
// 列选择
=A1.new(EID,NAME)
// 别名
=A1.new(EID:EmployeeNo,NAME+" "+SURNAME: EmployeeName)
// 排序
=A1.sort(BIRTHDAY,-SALARY)
// 去重 只保留此列
=A1.id(CLIENT)
// 去重 保留其他列
=A1.group@1u(列名)
// 先分组再聚合
=A11.group(客户).new(客户,~.count():订单数)
// 直接分组聚合
=A11.groups(客户,销售员; sum(账户): 总金额,count(客户):订单数)
// in
[1,3,5,7,9]
=demo.query("select * from EMPLOYEE")
=A2.select(A1.pos(EID)>0)
