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...