Excel 内容转成 CSV,容量大了一倍

2023-07-15 11:20:05 +08:00
 jianghu52

最近做了一个小工具,把 EXCEL 里面的内容抽出来,编辑一下转换成 CSV 。 发现一个诡异的问题。EXCEL 的 size =30M 。转换出来的 CSV 的 size=56M 。 EXCEL 比较大,里面数据大概 28w 条。里面格式不多,基本上就是字符串+数字+日期。有 4 列是下拉列表,候选值 是第二个 sheet 页的内容。 我的工具就是把所有内容抽出来,主要是把下拉列表的内容替换成 0 或者 1. 用的语言就是 C#(环境被迫),读 EXCEL 用的 EPPLUS ,写 csv 就直接用 writestream 。

我的概念中,一直都认为 csv 比 excel 少了格式,所以 csv 应该是比 excel 小才对。我自己做过实验。如果数据不多的情况下(200 条),csv 确实是比 EXCEL 小的。但是为什么数据量上去之后,CSV 比 EXCEL 大了呢?

求解惑。

3279 次点击
所在节点    程序员
15 条回复
shansing
2023-07-15 11:22:38 +08:00
不知道你说的哪个版本,xlsx 是外层是 zip 包,压缩了可不就小嘛。
Ocean810975
2023-07-15 11:27:25 +08:00
excel 是压缩过的,csv 没有压缩过,和 txt 实际上是一个东西。
数据量大了压缩的优势才体现出来,数据量小的时候就和你上面写的一样。
jianghu52
2023-07-15 11:28:05 +08:00
@shansing 不好意思,忘记说版本了。EXCEL 是 2007 版本。后缀.xlsx 。但是我奇怪的是为什么小数据量的时候,是 CSV 小。大数据量的时候,就是 excel 小。
em70
2023-07-15 11:29:20 +08:00
把 xlsx 文件后缀改成 zip ,打开有惊喜哦
jklove123bai
2023-07-15 11:31:03 +08:00
xlsx 这个格式本身啥都没有就 4k 大小了
dayeye2006199
2023-07-15 11:34:52 +08:00
csv 你上个 zip 看看
512357301
2023-07-15 11:53:31 +08:00
一直都认为 csv 比 excel 少了格式

03 版本的 Excel(.xls)才符合这个规律吧,07 及以上版本的(.xlsx)都是用的压缩格式,容量占用确实小很多。但是因为有一些配置文件,所以内容越少.xlsx 压缩效果越不明显。
想比.xlsx 还小,那我推荐你把内容存为 Apache Parquet 格式(.parquet),它是列式存储,压缩效果理论上更好,而且读取效果不比 Excel 、csv 差
akira
2023-07-15 12:08:25 +08:00
猜测应该主要就 2 个东西。所有的压缩算法都在数据量非常小的时候肯定比明文要长。

1. excel 文件本身额外带的一些信息。
2. 压缩的基本信息。
duvet
2023-07-15 12:37:27 +08:00
@jianghu52
> 为什么小数据量的时候,是 CSV 小
因为 xlsx 有 overhead ,csv 是怎么样储存数据的用记事本打开就知道了
kenvix
2023-07-15 12:44:11 +08:00
再试试 xlsb 格式,更有惊喜🤣
oldshensheep
2023-07-15 13:04:53 +08:00
@jianghu52
> 数据量的时候,是 CSV 小。大数据量的时候,就是 excel 小。

这个其实也不一定,数据量大的时候也可能是 CSV 小。
这个我之前就遇到过,主要是因为 xlsx 的储存方式有太多的格式信息,我一个 167MB 的 CSV 数据转换成 xlsx 变成了 183MB ,把 xlsx 解压有发现有 969MB 的 xml 文件……你打开这个 xml 文件就会发现有非常多的格式信息。我这个数据集主要是浮点数,而且还有很多缺失值,就导致格式信息占用非常大的空间。

而如果你把 csv 压缩成 zip ,实际上只有 50MB 。
Cu635
2023-07-15 13:41:43 +08:00
@jianghu52 #3
上面有人说过了,xlsx 实际上就是 zip 压缩包。
那么既然数据压缩了,需要有信息来记录以下压缩的时候,至少需要怎么压缩的(算法)吧,要记录用的参数吧,当然还有一些其它元信息,这些都是死重啊;数据量小(原文件体积小)的时候,压缩节省不了多少空间,这些死重占用了空间可不就是“压缩之后更大”了嘛;数据量大(原文件体积大)了,压缩节省的空间大于死重,才会减小。
rpman
2023-07-15 15:21:37 +08:00
没什么难理解的
xlsx 做了一次 zip, 但要绑配置信息
csv 除了 header 外没配置信息, 但不区分数据类型, 外加 comma 占了字符位置
a132811
2023-07-15 17:24:18 +08:00
@rpman 以前写 xlsx 转换时,我遇到过你说的这种情况。
xlsx 的格式中 row.length col.length 可能超级长(因为有人不小心把表格行列数拖得非常大,就是拖了个几十万行或几十万列,都是无效的行和列,根本没有存任何数据)。
这种情况转成 csv 的话,就是超级长的几十万重复的 comma 占位符。我只好先检测行列的有效性,找到真正有效的行列数
jifengg
2023-07-16 09:42:43 +08:00
xlsx 里,如果两个单元格文本内容一样,它是只存一份的哦( sharestring ),如果有大量相同文本,那 xlsx 体积不会太大。
日期是时间戳存储,比年月日的省。csv 毕竟是文本存储,这俩数据量上去了,就大了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/956953

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX