环球科技在此|的 SQL 应用方案,esProc( 二 )


read函数可参考http://doc.raqsoft.com/esproc/func/read.html
跳过空行
有些文件存在空行 , 需要跳过才能使用 。 处理这种情况的一般思路是:在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/func/select.html
如果首行数据无效 , 就不能用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()}whereClient='TAS'
数据源为SPL中间计算结果
从前面例子可以看出 , 有些文件不够规范 , 需要用较长的SPL代码去解析文件 。 SPL代码太长 , 就无法利用网格代码的优势 , 不仅影响阅读代码 , 且不方便查错改错 。 为了充分利用网格代码的优势 , esProcSQL允许将任意的SPL中间计算结果作为数据源 。
比如“文件在任意位置都可能存在空行”这个例子 , 可以改用下面的代码:
环球科技在此|的 SQL 应用方案,esProc
文章图片
任意的SPL中间结果都可以作为SQL的数据源 , 这就给SQL语句提供了无限的可能性 , 包括复杂的文件解析、特殊数据源、大文件计算、循环判断、多源混算等等 。
数据源为Excel粘贴而来的数据
把Excel文件当数据源是SQL的基本用法 , 也可以利用SPL , 把Excel粘贴而来的数据当做数据源 。
比如Excel存储着学生成绩 , 如下图:
环球科技在此|的 SQL 应用方案,esProc
文章图片
首先在Excel中选定A1:D10 , 连带列名一起复制粘贴到esProc脚本的A1单元格 , 再编写SPL代码 , 最后编写SQL 。 如下图:
环球科技在此|的 SQL 应用方案,esProc
文章图片
注意 , 一定要进入A1格的编辑状态才能进行复制 , 不然会把剪贴板的内容填进一大片格子 , 虽然也有办法进行计算 , 但占有区域太大 , 会影响代码布局 。
多行记录
多行记录属于格式不规范的文件 , 比如下面的文件每三行代表一条记录 , 第一条记录是:26TAS12142.42009-08-05 。
环球科技在此|的 SQL 应用方案,esProc
文章图片
下面使用SPL将该文件整理成规范二维表 , 再用作SQL数据源 , 代码如下:
环球科技在此|的 SQL 应用方案,esProc
文章图片
多源混算
利用SPL语言 , 可以在SQL中实现不同数据源之间的混合计算 。
比如Oracle的sales表存放员工的销售订单 , excel文件emp.xlsx存放各部门的员工信息 , 需要计算每个部门的销售额 , 可使用如下代码: