告别数据库束缚!用esProc在 csv 文件上执行 SQL

server/2025/3/18 13:51:00/

esProc SPL 支持简单 SQL,可以直接在 csv 等结构化文本文件上执行 SQL 语句,这样,不用数据库也可以用 SQL 计算了。

先下载 esProc SPL:免费下载

不想折腾源代码的话,可以用标准版,找到相应版本下载后安装即可。

准备好一个格式标准的 csv 文件。

0png

打开 esProc IDE,新建脚本,在 A1 格写 SQL:

$select * from d:/Orders.csv

注意前面的 $ 表示这句是 SQL,否则缺省认为是原生的 SPL 语句。

按 Ctrl-F9 执行,在右边可以看到,文件被读成数据表的形式:

1png


SPL 代码写在这些单元格中,每个格执行完后就会有个值,在右边可以实时看到,这样非常便于调试。

TAB 分隔的 txt 也一样可以支持,比如这个文件:

3png


在 A2 中写入:

$select * from d:/Orders.txt

并按 Alt-Enter 执行该格,esProc IDE 允许单步执行某一条语句,这样特别方便交互式数据分析。
右边会看到同样的结果:

4png


esProc 的 SQL 认为 txt 是 TAB 分隔的,csv 是逗号分隔,会根据扩展名自动处理。如果扩展名写错就可能读出错误的结果。

有些文件没有标题行:

5png


这里需要用 SPL 原生语法才能读出来,在 A3 中写:

$select * from {file("d:/OrdersNT.csv").import@c()}

其中 {…} 是 SPL 原生语法,表示读取文本文件,没有标题行,分隔符是逗号。
执行后可以可看到结果:

6png


esProc 将自动用序号表示列名。
类似地,不同分隔符的文本,也可以用 SPL 原生语法读出。

读取之后再试试计算,先看 WHERE,在 A4 中写:

$select * from d:/Orders.csv where Amount>=100 and Client like '%s%'

执行后的结果:

7png


把 Amount 大于 100 并且 Client 包含 s 的记录过滤了出来。

日期上的运算:

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

8png


CASE WHEN 也支持:

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

9png


再看看 GROUP BY:

A7:$select Client,year(OrderDate) y,sum(Amount) amt from d:/Orders.csv group by Client,year(OrderDate)

10png


再加个 HAVING:

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

JOIN 语句也不在话下:

A9: $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

12png


看起来支持得还挺全面,官方号称是支持到 SQL92,连 WITH 也可以无拘无束,但是还不支持窗口函数。不过问题也不大,窗口函数写起来本来也很繁琐,esProc 的原生 SPL 语法要来比窗口函数简单多了,也就没太大必要再支持窗口函数了。

esProc 还可以命令行的方式执行 SQL,比如上面的 GROUP BY:

13png

除了文本文件,esProc 的 SQL 还支持 XLS\MongoDB\restful json 等数据源,用法都差不多,感兴趣者可移步乾学院。


http://www.ppmy.cn/server/175973.html

相关文章

用 Vue 3.5 TypeScript 重新开发3年前甘特图的核心组件

回顾 3年前曾经用 Vue 2.0 开发了一个甘特图组件&#xff0c;如今3年过去了&#xff0c;计划使用Vue 3.5 TypeScript 把组件重新开发&#xff0c;有机会的话再开发一个React版本。 关于之前的组件以前文章 Vue 2.0 甘特图组件 下面录屏是是 用 Vue 3.5 TypeScript 开发的目前…

AGI大模型(8):提示词的安全与防护

1 前言 著名的「奶奶漏洞」&#xff0c;⽤套路把 AI 绕懵。 2 常⻅的提示词攻击技术 2.1 同类型⽬标劫持 同类⽬标劫持攻击&#xff0c;特别是在同类型任务的背景下&#xff0c;涉及到攻击者通过⾮法⼿段控制模型&#xff0c;并迫使其执行与原始任务性质相同但⽬标不同的操作…

Linux《进度条》

在之前的Linux基础开发工具当中我们已经了解了vim、gcc、makefile等基本的开发工具&#xff0c;那么有了这些开发工具我们就可以来实现我们Linux旅程当中的第一个程序——进度条。相信通过该项目的实现能让你对vim等开发工具更加的熟悉。一起加油吧&#xff01;&#xff01;&am…

时区转换工具

开发一个Python程序&#xff0c;将用户输入的北京日期时间转换为全球多个目标地区的对应时间&#xff0c;支持手动选择地区&#xff0c;并显示开始和结束两个时间段的转换结果 import pytz from datetime import datetime import pandas as pd from tabulate import tabulate …

Python 视频爬取教程

文章目录 前言基本原理环境准备Python安装选择Python开发环境安装必要库 示例 1&#xff1a;爬取简单直链视频示例 2&#xff1a;爬取基于 HTML5 的视频&#xff08;以某简单视频网站为例&#xff09; 前言 以下是一个较为完整的 Python 视频爬取教程&#xff0c;包含基本原理…

计算机基础:二进制基础13,十六进制与二进制的相互转换

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏&#xff0c;故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 &#xff08;一&#xff09;WIn32 专栏导航 上一篇&#xff1a;计算机基础&#xff1a;二进制基础12&#xff0c;十进制数转换为…

EasyExcel动态拆分非固定列Excel表格

使用EasyExcel动态拆分非固定列Excel表格 在Excel数据解析场景中&#xff0c;​动态列结构拆分是典型挑战&#xff08;如供应链系统中不同品类的属性字段差异较大&#xff09;。传统基于POJO映射的方案无法应对列数量不固定的场景。本方案采用EasyExcel的动态模型解析和Map数据…

C++之list类及模拟实现

目录 list的介绍 list的模拟实现 定义节点 有关遍历的重载运算符 list的操作实现 &#xff08;1&#xff09;构造函数 (2)拷贝构造函数 &#xff08;3&#xff09;赋值运算符重载函数 &#xff08;4&#xff09;析构函数和clear成员函数 &#xff08;5&#xff09;尾…