当前位置: 首页 > backend >正文

如何用 esProc SPL 操作大 csv

esProc SPL 提供了游标运算,可以用非常简单的代码操作大 csv 文件,稍加改动就能变成并行计算,还有图形化界面,比 Pyhton 方便多了。
先去这里下载 esProc SPL:» esProc Download - esProc SPL Official Website
懒得折腾源码的话可以用标准版,下载并安装。
准备好一个大 csv 文件:

Picture1png


打开 esProc IDE,新建脚本,在 A1 格写 SPL 代码,读取前 100 条:

=file("d:/OrdersBig.csv").cursor@tc().fetch(100)

函数 cursor 表示用游标打开文本文件,@表示函数的扩展选项,@t 表示首行为列名,@c 表示分隔符为逗号。
因为是大文件,全部读入内存可能溢出,所以只读 100 条看一下。
按 ctrl-F9 执行,可以在右边看到计算结果数据表。

Picture2png

SPL 代码写在单元格中,每个格执行后就会有个值,在右边可以看到,这会给调试带来很大的方便。

来试试计算,先数一下行数:

 A
1=file("d:/OrdersBig.csv").cursor@tc()
2=A1.skip()

函数 skip 用来跳过 N 条记录并返回跳过的记录数,参数为空时跳过全部记录。

Picture3png

共有 101,730,411 条记录。

再看看过滤,选出 Amount 在 3000 至 4000 之间,Client 含有 s 的记录:

 A
1=file("d:/OrdersBig.csv").cursor@tc()
2=A1.select(Amount>3000 && Amount<=4000 && like@c(Client,"*s*"))
3=A1.fetch(100)

函数 select 用于条件过滤,函数 like 用于字符串匹配,* 是通配符,@c 表示不区分大小写。

因为可能结果还是很多,也只取前 100 条看看,执行结果在 A3:

Picture4png

排序也可以,比如按 OrderDate 的顺序、Amount 的逆序排序:

 A
1=file("d:/OrdersBig.csv").cursor@tc()
2=A1.sortx(OrderDate,-Amount)
3=file("d:/result.csv").export@tc(A2)
4=file("d:/result.csv").cursor@tc().fetch(100)

排序后把结果写入新文件,再打开新文件,取前 100 条。函数 sortx 用于大文件排序,- 表示逆序。

执行后看右边结果,已经排好序了。

Picture5png

再做些复杂的运算,分组汇总:

 A
1=now()
2=file("d:/OrdersBig.csv").cursor@tc(OrderDate,Client,SellerID,Amount)
3=A2.select(year(OrderDate)>=2020 || !Client || to(101,400).contain(SellerID))
4=A3.groups(year(OrderDate):y,month(OrderDate):m; sum(Amount):amt)
5=output(interval@s(A1,now()))

SQL 程序员一定对 A4 的 groups 函数很熟悉,这里就不多说了。

A2 打开游标时只读要用到的列,可以提高速度。这里还增加了 A1 和 A5 来统计运行时间,并打印在控制台:

Picture6png

可以看到运行时间:145 秒。

并行计算可以充分利用现在的多核 CPU,必须试一试。把上面代码改成并行计算,只要在 cursor 函数后简单加个选项 @m,其余不变:

 A
1=now()
2=file("d:/OrdersBig.csv").cursor@tcm(OrderDate,Client,SellerID,Amount)
3=A2.select(year(OrderDate)>=2020 || !Client || to(101,400).contain(SellerID))
4=A3.groups(year(OrderDate):y,month(OrderDate):m; sum(Amount):amt)
5=output(interval@s(A1,now()))

@m 表示按照 option 里配置的并行选项进行多线程计算。

同时把这个并行选项打开。

Picture7png


现在执行一遍:

Picture8png


提升到了 92 秒,可能受到硬盘的并发限制,做不到倍数性能提升,用 2 线程跑的结果也差不多。

上面是几个基本运算,官网上对大 csv 计算的例子更加广泛深入,代码也都很简单,值得一看。

http://www.xdnf.cn/news/13237.html

相关文章:

  • Linux【5】-----编译和烧写Linux系统镜像(RK3568)
  • MIPI信号为什么不能进行长距离传输
  • 相关类可视化图像总结
  • 第二十三课:手搓随机森林
  • 基于PSO与BP神经网络分类模型的特征选择实战(Python实现)
  • C语言中提供的第三方库之哈希表实现
  • 比较数据迁移后MySQL数据库和达梦数据库中的表
  • 深入实战多平台抓包:Sniffmaster与常见抓包工具协同利器解析
  • 前端绘制道路鱼骨图
  • 502的普通频谱参数设置
  • 红外测温传感器如何提升智能制造水平?
  • 学习时困了怎么办
  • 2020年IS SCI2区,多样本和遗忘能力粒子群算法XPSO,深度解析+性能实测
  • Python打卡day49!!!
  • 【精彩回顾.上海交通大学专场】---大模型推理需求下的计算生态链变革
  • “概率鹦鹉”难解语义等价验证的NPC难题: 从技术本质看LLM在SQL优化任务中的致命缺陷
  • 高并发内存池的轻量级模拟-细节处理与优化部分
  • 多协议诱骗电压芯片优势,如何防止负载太大而导致充电器复位重启
  • DisplayPort 2.0协议介绍(2)
  • JavaScript 标签加载
  • AI知识库调用全攻略:四种实战方法与技术实现
  • c++第七天 继承与派生2
  • 安全编程期末复习12(红色重点向下兼容)
  • 河南建筑安全员C证考试常见题及答案解析
  • 2.7 判断.lib和.a是静态库 还是动态库的导入库
  • 基于Docker部署MYSQL主从复制
  • RT_Thread——线程管理(下)
  • 数学公式中latex的粗体问题
  • vSphere环境ubuntu24.04虚拟机从BIOS切换为EFI模式启动
  • 链表反转示例代码