处理csv文件的几种方法
Lv.2潜力创作者
昨天有朋友问,如何处理300万行的表格
大家的第一反应都是,用数据库
但有些软件,比如金蝶,直接访问他的数据库是相当困难且危险的
想要导出xlsx,又超过了表格的行上限,需要分表,处理起来十分麻烦
所以选择导出成csv格式,是比较合适的
这里我创建了一个3000011行的a.csv表
共有两列:
x列是A到Z共26个字母,用来分类
y列是随机的保留两位小数的数字,用来做合计
目的是根据x列进行groupby分类汇总,计算y的和
一、SQL方式
论坛里有大佬分享过,wps可以调用duckdb查询csv,速度非常快
| 🔔 | duckdb -c "copy (select x,sum(y) from 'a.csv' group by x) to 'b.csv';" |
可以写sql进行查询,输出到b.csv非常方便,耗时0.8秒
二、DataFrame方式
另一种常见查询是通过python的pandas或polars
| 🔔 | import pandas as pd df = pd.read_csv("a.csv") result = df.groupby('x')['y'].sum() print(result) |
介绍df查询的书很多,用ai写也很准,耗时3秒
三、awk方式
awk在处理不太标准的csv时更有优势
比如拼接字符串时,会动态扩展而非重新申请空间,比py或js快很多
类似的还有perl,在需要用正则处理csv时更好
| 🔔 | goawk --csv 'NR>1{d[$1]+=$2}END{for(i in d)printf "%s,%.2f\n", i, d[i]}' a.csv > c.csv |
goawk和gawk都支持csv参数,用字典d进行统计,第一列作为键,累计第二列的值,结果输出到c.csv,耗时3秒
四、JSA方式
上面的工具都可以在wps里调用,但毕竟需要安装第三方工具
直接使用JSA也行,因为js环境并不受表格104万行的限制
写的比较丑,只是读取csv,分行,分列,用字典d进行统计,结果写入d.csv,耗时7秒
上面的每一种方法都有很多替代工具,比如sql方式可以用trdsql dsq等,df方式可以用nushell等,脚本可以选其他任何你熟悉的语言,JSA也可以通过ffi调用fgets逐行读取,以减少ReadFile占用大量内存的问题
总的来说,导出成csv以后,处理超过100万行的表格时,会有更多选择,多数时候速度比表格里的公式快很多
当然,如果数据超过1000万行,还是用数据库更好