01用SQL直接查询文件

手头有txt/csv/xls/xlsx想用SQL查一下,常规方法需要繁琐的准备工作,如安装数据库、建表、导入数据等

默认支持格式规范的文件

  • 分隔符为逗号,首行为字段名的csv
  • 分隔符为tab,首行为字段名的txt
  • 首行为列名的xls/xlsx
  • 支持格式不规范的文件
把文件当库表,直接写SQL

SPL Win符合SQL92标准,包括:

  • where, order by, distinct, group by…having…
  • sum, count, max, min, avg
  • inner join, Left join, full join
  • union, union all, intersect, minus
  • from子句、with子句、嵌套查询、Case when、NULLIF、COUNTIF、COALESCE
  • as, between, like, Top-N, limit n offset m
  • select …… into 'new file name'
  • 大量字符串函数、数学函数、日期函数

02文件间的混合计算

关联csv和xls,进行分组汇总。常规方法每个文件都要建表入库,过程非常繁琐
  • 混合计算还包括集合计算、子查询、in函数等形式
  • 任意文件格式都可以混合计算
  • 如果选择了工作目录,则不必写目录名
直接关联,方便快捷

03批量文件的合并拆分

某目录下的xls以日期命名,每个文件存储一天的销售记录(下面是两个文件),现在要找出某个月所有的xls,进行分组汇总。常规方法要手工合并文件再入库,工作量巨大
直接写SQL,支持文件名通配符,并自动合并文件
在工作区双击单个文件可直接打开(导入),计算结果可直接导出为单个文件(导出)
将订单按客户列拆分到新xls,每个sheet保存一个客户的订单,sheet名为客户名。
SQL不支持文件拆分,SPL原生代码支持
T("Orders.xlsx").group(Client).(file("Ordersm.xlsx").xlsexport@ta(~;~.Client))

更多文件(含sheet)合并拆分例子

  • 合并多层子目录下的文件
  • 将文件按固定行数拆分成多个sheet或文件
  • 将某一固定列和其他各列组合,每个组合分别写入sheet或文件
  • 对多个卡片式sheet,或一个sheet里的多个卡片式表格,将同样位置的格值进行汇总计算,生成汇总卡片
  • 将一个sheet里的多个卡片式表格,整理成规范二维表
  • 将多个卡片式sheet合并成规范二维表,每个卡片对应一行
  • 将一个行式文件拆分成多个卡片式sheet,每个卡片对应一行

04查询格式不太规范的文件

txt没有首行列名
26	TAS		1	2142.4	2009-08-05
33	DSGC	1	613.2	2009-08-14
84	GC		1	88.5		2009-10-16
133	HU		1	1419.8	2010-12-12	
{}里的file("d:/noColName.txt").import()是SPL原生代码 ,具有强大的解析能力
用SPL原生语法解析格式不规范的文件,用序号访问列名
txt的分隔符是双竖线。常规方法通常不支持多分隔符,要编程才能解析。
OrderID||Client||SellerId||Amount||OrderDate
26||TAS||1||2142.4||2009-08-05
33||DSGC||1||613.2||2009-08-14
84||GC||1||88.5||2009-10-16
import@t(;,"||")表示分隔符是双竖线
用SPL原生语法解析格式不规范的文件,支持多分隔符。
跳过xls无用的前两行。常规方法通常不支持跳过无用行,要编程才能解析。
xlsimport@t(;,3)表示解析xls,从第3行读起
用SPL原生语法解析格式不规范的文件,跳过无用空行。
格式更复杂的文件需要用交互式计算分步骤解析。

更多例子

  • 字段按固定列宽分隔
  • 文件的不定位置有无用的空白行
  • 文件的第N至第M行是有效数据
  • 文件的字符串字段前后有空白
  • csv字段的前后有无用的引号、单引号、括号
  • csv字段按Excel规则(引号)处理转义
  • csv的日期类型形如"01-01-2012"
  • txt区分记录的标志不是回车换行而是分号
  • Xls的部分列无效
  • 打开xls需要密码
  • 按名字或序号读取xls的sheet

05交互式计算

txt每三行代表一条记录,对其进行分组汇总。常规方法必须通过编程解析,且代码较难写
33
DSGC	2	613.2
2009-08-14
84
GC1	1	88.5
2009-10-16
133
HU	1	1419.8
2010-12-12
点击按钮 可对计算结果命名或改名
先用SPL原生语法整理数据,并对计算结果命名,在此基础上编写SQL。这个过程即交互式计算。

继续交互式计算
继续过滤
继续关联
不断探索不断计算,实现多步骤复杂计算
销售额占到一半的前n个客户。常规方法难度较大。
1.按销售额对客户排序
2.添加累计列Field,在单元格输入公式==cum(Amt)
交互式计算可明显简化计算过程
也可以用SPL原生代码求计算列,即ClientAmt.derive(cum(Amt):Field)
销售额占到一半的前n个客户。继续交互。
3.求总额的一半
4.总额一半所在位置,即n
5.该位置之前的记录,即计算目标
销售额占到一半的前n个客户。以下步骤可选。
6.单独取出计算目标
7.导出为xls
8.持久保存或分享xls

更多例子

  • 某支股票最长的连续上涨天数
  • 在各部门找出比本部门平均年龄小的员工
  • 找出印度籍经理的美国籍员工
  • 日志文件解析
  • Excel片区的每个单元格都是Key-Value
  • 将某字段按分隔符拆分成N行后是规范二维表
  • 将多行用分隔符合并成一行后是规范二维表
  • 转置后是规范二维表
  • 个别行的第2列缺失,这些行的其他列需要后移一位
  • 不定行对应一条记录,记录开头有固定标志