V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jianghu52
V2EX  ›  程序员

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

  •  
  •   jianghu52 · 2023-07-15 11:20:05 +08:00 · 3210 次点击
    这是一个创建于 497 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近做了一个小工具,把 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 大了呢?

    求解惑。

    15 条回复    2023-07-16 09:42:43 +08:00
    shansing
        1
    shansing  
       2023-07-15 11:22:38 +08:00   ❤️ 3
    不知道你说的哪个版本,xlsx 是外层是 zip 包,压缩了可不就小嘛。
    Ocean810975
        2
    Ocean810975  
       2023-07-15 11:27:25 +08:00 via Android
    excel 是压缩过的,csv 没有压缩过,和 txt 实际上是一个东西。
    数据量大了压缩的优势才体现出来,数据量小的时候就和你上面写的一样。
    jianghu52
        3
    jianghu52  
    OP
       2023-07-15 11:28:05 +08:00
    @shansing 不好意思,忘记说版本了。EXCEL 是 2007 版本。后缀.xlsx 。但是我奇怪的是为什么小数据量的时候,是 CSV 小。大数据量的时候,就是 excel 小。
    em70
        4
    em70  
       2023-07-15 11:29:20 +08:00
    把 xlsx 文件后缀改成 zip ,打开有惊喜哦
    jklove123bai
        5
    jklove123bai  
       2023-07-15 11:31:03 +08:00
    xlsx 这个格式本身啥都没有就 4k 大小了
    dayeye2006199
        6
    dayeye2006199  
       2023-07-15 11:34:52 +08:00
    csv 你上个 zip 看看
    512357301
        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 差
    akira
        8
    akira  
       2023-07-15 12:08:25 +08:00
    猜测应该主要就 2 个东西。所有的压缩算法都在数据量非常小的时候肯定比明文要长。

    1. excel 文件本身额外带的一些信息。
    2. 压缩的基本信息。
    duvet
        9
    duvet  
       2023-07-15 12:37:27 +08:00
    @jianghu52
    > 为什么小数据量的时候,是 CSV 小
    因为 xlsx 有 overhead ,csv 是怎么样储存数据的用记事本打开就知道了
    kenvix
        10
    kenvix  
       2023-07-15 12:44:11 +08:00
    再试试 xlsb 格式,更有惊喜🤣
    oldshensheep
        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 。
    Cu635
        12
    Cu635  
       2023-07-15 13:41:43 +08:00
    @jianghu52 #3
    上面有人说过了,xlsx 实际上就是 zip 压缩包。
    那么既然数据压缩了,需要有信息来记录以下压缩的时候,至少需要怎么压缩的(算法)吧,要记录用的参数吧,当然还有一些其它元信息,这些都是死重啊;数据量小(原文件体积小)的时候,压缩节省不了多少空间,这些死重占用了空间可不就是“压缩之后更大”了嘛;数据量大(原文件体积大)了,压缩节省的空间大于死重,才会减小。
    rpman
        13
    rpman  
       2023-07-15 15:21:37 +08:00
    没什么难理解的
    xlsx 做了一次 zip, 但要绑配置信息
    csv 除了 header 外没配置信息, 但不区分数据类型, 外加 comma 占了字符位置
    a132811
        14
    a132811  
       2023-07-15 17:24:18 +08:00   ❤️ 1
    @rpman 以前写 xlsx 转换时,我遇到过你说的这种情况。
    xlsx 的格式中 row.length col.length 可能超级长(因为有人不小心把表格行列数拖得非常大,就是拖了个几十万行或几十万列,都是无效的行和列,根本没有存任何数据)。
    这种情况转成 csv 的话,就是超级长的几十万重复的 comma 占位符。我只好先检测行列的有效性,找到真正有效的行列数
    jifengg
        15
    jifengg  
       2023-07-16 09:42:43 +08:00 via Android
    xlsx 里,如果两个单元格文本内容一样,它是只存一份的哦( sharestring ),如果有大量相同文本,那 xlsx 体积不会太大。
    日期是时间戳存储,比年月日的省。csv 毕竟是文本存储,这俩数据量上去了,就大了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2415 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 02:07 · PVG 10:07 · LAX 18:07 · JFK 21:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.