查询 csv/xls 等文件--SPL 轻量级多源混算实践 2

用 SPL 查文件也很简单,而且能处理各种文件格式。

计算用例

查询目标

基于 orders1.csv(有标题),统计 2024 年各类订单状态的订单金额

SPL 语法

编写脚本

A1:读入 CSV,T() 函数会根据文件扩展名读出文件内容,返回成序表全部加载到内存

A2:过滤 2024 年数据

A3:按订单状态分组汇总

有时 csv 可能没有标题行,这时该怎么处理呢?

比如要基于没标题的 orders2.csv 完成前面的计算。

A1:加了 @b 选项代表处理无标题文件,读出后字段名会用 _1 _2 _3...来表示

A2:就用 _3(第三列)来过滤 2024 年数据。

后面的计算是类似的。

除了这种方式,SPL 还允许使用列号来读取该列数据:

这里不再用列名而是通过 #列号 的方式来计算。

SQL 语法

SPL 的原生语法可以完成各类计算,但有时对于熟悉 SQL 的人如果能用 SQL 查文件就好了。SPL 考虑到了这点,也提供了 SQL 语法。

比如前面的计算,也能直接用 SQL 搞定。

有标题时:

csharp 复制代码
$select order_status,sum(total_amount) tamt from orders1.csv where year(order_date)=2024 group by order_status

直接基于 CSV 执行 SQL,不仅仅是 CSV,XLS\MongoDB\Restful\Json 各类数据源都可以。

处理无标题 CSV 时要复杂一些,需要借助 SPL 语法读入数据再用 SQL 查询:

sql 复制代码
$select _10 order_status,sum(_8) tamt from  {T@b("orders2.csv")} where year(_3)=2024 group by _10

这里{T@b("orders2.csv")} 用大括号包上的内容就是 SPL 语法,因为返回的字段名都是 _1 _2 形式,SQL 使用的字段名也都是这种。

目前 SPL 提供的 SQL 语法支持到 SQL92 程度,连 WITH 也可以使用,但是并不支持窗口函数,因为使用 SPL 原生语法可以处理各种复杂计算,所以支持到这种程度就够了。

下面是一些 SQL 查询示例。

日期计算:

sql 复制代码
$select * from d:/Orders.csv where (OrderDate<date('2020-01-01') and Amount<=100) or (OrderDate>=date('2020-12-31') and Amount>100)

Case when:

sql 复制代码
$select case year(OrderDate) when 2010 then 'this year' when 2010 then 'last year' else 'previous years' end from d:/Orders.csv

Group by ...having:

sql 复制代码
$select Client,year(OrderDate) y,sum(Amount) amt from d:/Orders.csv 
group by Client,year(OrderDate) having sum(Amount)>1000

JOIN:

csharp 复制代码
$select o.OrderId,o.Client,e.Name e.Dept,e.EId from d:/Orders.csv o 
left join d:/Emp.csv e on o.SellerId=e.Eid

Excel 处理

处理 Excel 也类似,比如根据 orders.xls,分别读取第二个 sheet(有标题)和第三个 sheet(无标题),查询订单金额超过 500 的大客户。

我们把代码写在一起:

对于熟悉 SQL 的选手,相对简单的情况用 SQL 查,复杂情况用 SPL 原生语法来处理,而且二者可以混合使用,基本就无敌了。

相关推荐
子兮曰2 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰2 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
爱勇宝2 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
胡写代码2 天前
别再前后端各写一套表单校验了
java·后端
大勇前进2 天前
原生 PHP 还是 Laravel?小项目到底要不要上框架
后端
yuzhi_liu2 天前
我用 LangGraph4j 实现 Multi-Agent Supervisor
后端
alsmile2 天前
Node-RED 之外,国产规则引擎的新方案:基于标准语法,Go 先行实现
后端·开源·go
大白802 天前
PHP 内存溢出排查思路:看懂报错日志,精准定位问题
后端
二月龙2 天前
PHP 接口返回统一响应封装,让前后端对接更省心
后端
盖伦发发2 天前
软件工程SOLID 五大设计原则
后端·软件工程