Excel 内容转成 CSV,容量大了一倍 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
jianghu52
V2EX    程序员

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

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

    最近做了一个小工具,把 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     Solana     938 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 21ms UTC 23:31 PVG 07:31 LAX 15:31 JFK 18:31
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86