处理csv文件的几种方法

wils
wils Lv.2 潜力创作者

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万行,还是用数据库更好

海南省
浏览 114
收藏
10
分享
10 +1
2
+1
全部评论 2
 
拾光漫行
跟着wils老师学习技术
· 重庆
回复
 
加加减减加加
厉害啊
· 湖北省
回复