跳至主要內容

SPL 函数参考

程序员李某某大约 6 分钟

SPL 函数参考

序表

fname

fname()open in new window:根据字段序号取得序表中的字段名称。

  • 语法

    T.fname(i)
    -- 从序表T中取得字段序号为i的字段名称,无参数则返回T中所有字段名。
    
  • 参数

    T -- 序表。
    i -- 字段序号。
    
  • 示例

    =A1.fname()
    =A1.fname(2)
    

array

array()open in new window:序表转序列

  • 语法

    r.array(Fi,…)
    -- 依次取得记录r中Fi对应的字段值,省略Fi则取所有字段值并返回成序列
    
  • 参数

    r --- 记录。
    Fi --- 字段名。
    
  • 示例

    =A1(1).array()
    =A1(1).array(STUDENTID,SCORE)
    

run

P.run()open in new window:针对排列中每条记录计算表达式。

A.run()open in new window:针对序列/排列中每个成员计算表达式,返回原序列。

  • 语法

    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)
    

文件

官方文档open in new window

file

从本地文件读取数据

import

import()open in new window:从本地文件导入数据

  • 语法

    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()open in new window: 根据文件扩展名读出文件内容,返回成序表

  • 语法

    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()open in new window:归并计算,将多个序表/排列合并。

  • 语法

    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()open in new window:通过关联键连接多个序表/排列

  • 语法

    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)
上次编辑于:
贡献者: 李元昊,liyuanhao