最近做了一个小工具,把 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 大了呢?
求解惑。
1
shansing 2023-07-15 11:22:38 +08:00 3
不知道你说的哪个版本,xlsx 是外层是 zip 包,压缩了可不就小嘛。
|
2
Ocean810975 2023-07-15 11:27:25 +08:00 via Android
excel 是压缩过的,csv 没有压缩过,和 txt 实际上是一个东西。
数据量大了压缩的优势才体现出来,数据量小的时候就和你上面写的一样。 |
3
jianghu52 OP @shansing 不好意思,忘记说版本了。EXCEL 是 2007 版本。后缀.xlsx 。但是我奇怪的是为什么小数据量的时候,是 CSV 小。大数据量的时候,就是 excel 小。
|
4
em70 2023-07-15 11:29:20 +08:00
把 xlsx 文件后缀改成 zip ,打开有惊喜哦
|
5
jklove123bai 2023-07-15 11:31:03 +08:00
xlsx 这个格式本身啥都没有就 4k 大小了
|
6
dayeye2006199 2023-07-15 11:34:52 +08:00
csv 你上个 zip 看看
|
7
512357301 2023-07-15 11:53:31 +08:00 via Android
一直都认为 csv 比 excel 少了格式
03 版本的 Excel(.xls)才符合这个规律吧,07 及以上版本的(.xlsx)都是用的压缩格式,容量占用确实小很多。但是因为有一些配置文件,所以内容越少.xlsx 压缩效果越不明显。 想比.xlsx 还小,那我推荐你把内容存为 Apache Parquet 格式(.parquet),它是列式存储,压缩效果理论上更好,而且读取效果不比 Excel 、csv 差 |
8
akira 2023-07-15 12:08:25 +08:00
猜测应该主要就 2 个东西。所有的压缩算法都在数据量非常小的时候肯定比明文要长。
1. excel 文件本身额外带的一些信息。 2. 压缩的基本信息。 |
9
duvet 2023-07-15 12:37:27 +08:00
|
10
kenvix 2023-07-15 12:44:11 +08:00
再试试 xlsb 格式,更有惊喜🤣
|
11
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 。 |
12
Cu635 2023-07-15 13:41:43 +08:00
@jianghu52 #3
上面有人说过了,xlsx 实际上就是 zip 压缩包。 那么既然数据压缩了,需要有信息来记录以下压缩的时候,至少需要怎么压缩的(算法)吧,要记录用的参数吧,当然还有一些其它元信息,这些都是死重啊;数据量小(原文件体积小)的时候,压缩节省不了多少空间,这些死重占用了空间可不就是“压缩之后更大”了嘛;数据量大(原文件体积大)了,压缩节省的空间大于死重,才会减小。 |
13
rpman 2023-07-15 15:21:37 +08:00
没什么难理解的
xlsx 做了一次 zip, 但要绑配置信息 csv 除了 header 外没配置信息, 但不区分数据类型, 外加 comma 占了字符位置 |
14
a132811 2023-07-15 17:24:18 +08:00 1
@rpman 以前写 xlsx 转换时,我遇到过你说的这种情况。
xlsx 的格式中 row.length col.length 可能超级长(因为有人不小心把表格行列数拖得非常大,就是拖了个几十万行或几十万列,都是无效的行和列,根本没有存任何数据)。 这种情况转成 csv 的话,就是超级长的几十万重复的 comma 占位符。我只好先检测行列的有效性,找到真正有效的行列数 |
15
jifengg 2023-07-16 09:42:43 +08:00 via Android
xlsx 里,如果两个单元格文本内容一样,它是只存一份的哦( sharestring ),如果有大量相同文本,那 xlsx 体积不会太大。
日期是时间戳存储,比年月日的省。csv 毕竟是文本存储,这俩数据量上去了,就大了 |