共计 3067 个字符,预计需要花费 8 分钟才能阅读完成。
esProc 的 SQL 性能反对文件计算、性能优化等独特性能,本文将总结桌面 IDE、命令行等不同环境下 SQL 的用法,以及罕用文件格式、非凡分隔符等多种利用计划,详情点击 esProc 的 SQL 利用计划
因为反对文件计算、性能优化等独特性能,esProc 的 SQL 性能深受大家青睐,为了大家更不便地应用,上面将总结 SQL 的各类利用计划。
根本用法
SQL 的根本数据源为文本文件和 Excel。文本文件有两种常见的分隔符,制表符分隔的文件个别以 txt 为扩展名,逗号分隔的文件通常以 csv 为扩展名,esProc 可凭借扩展名自动识别。Excel 有两种不同的版本,格局较旧的 xls 文件和格局较新的 xlsx 文件,esProc 同样可凭扩展名自动识别。
SQL 的根本数据格式为带列名的二维表,比方上面的 sales.txt:
SQL 的根本运行环境为网格脚本,在 windows/linux 下均可应用。在网格脚本中,能够编写 / 保护 / 执行多个 SQL,且点击不同的单元格可间接在左边查看计算结果。上面是一些例子:
具体 SQL 写法不是本文重点,若感兴趣可参考 在文件上应用 SQL 查问的示例
在命令行执行 SQL
不方便使用图形环境时,能够在命令行执行 SQL。Windows 下应应用 esprocx.exe 命令,例如:
esprocx.exe -r select * from Order.txt
须要留神的是,SQL 在 IDE 中必须应用前导符号 $,而命令行中能够省略该符号。
Linux 环境下应应用 esprocx.sh 命令,例如:
./esprocx.sh -r select * from Order.txt
无列名的状况
有些文件没有列名(列题目),则能够将 SPL 语句嵌入 SQL,利用 SPL 的能力灵活处理列名。比方 sOrderNT.txt 局部数据如下:
按第 2 列查问时,SQL 应写作:
$select * from {file(“sOrderNT.txt”).import()} where _2=’TAS’
从 SQL 中能够看到,数据无列名时,则以 ” 下划线 + 序号 ” 为默认列名,第 2 列的列名就用_2 示意,其余列以此类推。{} 内是 SPL 语言,其中 import 函数能够读取格局更简单的文件,具体用法参考 http://doc.raqsoft.com/esproc…
为了更直观地应用列名,能够先改列名再计算。传统的 SQL 写法是用子查问改列名,下面的 SQL 可改为:
传统的子查问效率不高且浏览不便,应用 SPL 语句能够防止子查问,同时能够达到批改列名的目标:
非凡分隔符
有些文件的分隔符不是常见的制表符或逗号,而是分号冒号等特殊符号,有时甚至用多个字符当分隔符,这种状况下应该用 SPL 语句中的 import 函数来指定分隔符。
比方 sep.txt 的分隔符是双线 ||,则能够用上面的 SQL 来读取:
$select * from {file(“sep.txt”).import@t(;,”||”)}
无换行符
有些文件没有用回车换行辨别记录,而是用其余符号,这样的文件整体出现为一个大字符串。比方 SOrderNL.txt 的记录之间用 | 符号分隔:
这种状况要把文件读为字符串,将 | 替换成回车换行,再用 import 函数解析为二维表。
$select * from {replace(file(“sOrderNL.txt”).read(),”|”,”rn”).import@t()}
read 函数可参考 http://doc.raqsoft.com/esproc…
跳过空行
有些文件存在空行,须要跳过能力应用。解决这种状况的个别思路是:在 SQL 中嵌入 SPL 语句,用 SPL 语句读入文件,查问出有用的数据行。
最简略的状况是首行数据无效(能够用 import 函数解析成二维表),而首行之后不定的地位存在空行。这样文件可用以下 SQL 查问:
$select * from {file(“sOrderb.txt”).import@t().select(#1)}
代码中第二个 select 是 SPL 的查问函数,select(#1) 示意第 1 个字段不为空。能够用该函数筛选更简单的数据行,而不仅仅是空行。函数 select 参考 http://doc.raqsoft.com/esproc…
如果首行数据有效,就不能用 import 函数解析成二维表了,这种状况下要用 read 函数读成行数据,找到无效数据后,再转为二维表。比方前 3 行有效,正式数据从第 4 行开始,SQL 代码为:
$select * from {file(“sOrderb.txt”).read@n().to(4:).concat(“rn”).import@t()}
代码中 to(4:) 示意取第 4 行直到结尾,即无效数据。concat(“rn”) 示意将多行数据拼成一个大字符串,行之间用回车换行符连贯。Import 函数可将字符串转为二维表。
更简单的状况下,文件在任意地位都可能存在空行,这时要用 SPL 的 select 函数进行个别查问,代码如下:
$select * from {file(“sOrderb.txt”).read@n().select(~!=””).concat(“rn”).import@t()} where Client=’TAS’
数据源为 SPL 两头计算结果
从后面例子能够看出,有些文件不够标准,须要用较长的 SPL 代码去解析文件。SPL 代码太长,就无奈利用网格代码的劣势,不仅影响浏览代码,且不不便查错改错。为了充分利用网格代码的劣势,esProc SQL 容许将任意的 SPL 两头计算结果作为数据源。
比方“文件在任意地位都可能存在空行”这个例子,能够改用上面的代码:
任意的 SPL 两头后果都能够作为 SQL 的数据源,这就给 SQL 语句提供了有限的可能性,包含简单的文件解析、非凡数据源、大文件计算、循环判断、多源混算等等。
数据源为 Excel 粘贴而来的数据
把 Excel 文件当数据源是 SQL 的根本用法,也能够利用 SPL,把 Excel 粘贴而来的数据当做数据源。
比方 Excel 存储着学生问题,如下图:
首先在 Excel 中选定 A1:D10,连带列名一起复制粘贴到 esProc 脚本的 A1 单元格,再编写 SPL 代码,最初编写 SQL。如下图:
留神,肯定要进入 A1 格的编辑状态能力进行复制,不然会把剪贴板的内容填进一大片格子,尽管也有方法进行计算,但占有区域太大,会影响代码布局。
多行记录
多行记录属于格局不标准的文件,比方上面的文件每三行代表一条记录,第一条记录是:26TAS12142.42009-08-05。
上面应用 SPL 将该文件整顿成标准二维表,再用作 SQL 数据源,代码如下:
多源混算
利用 SPL 语言,能够在 SQL 中实现不同数据源之间的混合计算。
比方 Oracle 的 sales 表寄存员工的销售订单,excel 文件 emp.xlsx 寄存各部门的员工信息,须要计算每个部门的销售额,可应用如下代码:
高性能文件格式
如果文件较大,SQL 性能较差,可转为 esProc 高性能文件格式 btx。比方将 orders.txt 转为 orders.btx,代码如下:
btx 的根本用法与文本文件和 Excel 一样,但性能会显著晋升,比方条件查问:
$select orderid,client,amount from sales.btx where Client=’TAS’
Txt 和 btx 的差别可参考 http://doc.raqsoft.com/esproc…
如果想进一步提高 SQL 性能,就要应用更高性能的 ctx 文件以及 esProc 扩大的 SQL+ 能力了,能够提供包含并行计算等能力,参考:http://doc.raqsoft.com/esproc…