为什么相同的数据在文本文件中要比在Excel文件中占用更多的空间?


59

我有大约100000行数据。如果我以文本文件格式存储此数据,则比以Excel文件格式存储数据要占用更多的空间。这是为什么?

Answers:


118

现代Excel使用的xlsx格式实际上是压缩格式。这是一个ZIP存档,其中包含具有特定结构的文本(XML)文件。

如果使用类似的ZIP压缩工具压缩纯文本文件,则应该获得类似的文件大小。

此外,正如布拉德利·乌夫纳Bradley Uffner)摩根(Morgen)在评论中所提到的,Excel将对相同的字符串进行重复数据删除,并仅存储它们的一个副本。我不确定这种方法的确切收益,它取决于您的数据集,但是简单的zip压缩可能会带给您大部分帮助。1个


9.1.3物理包装

每个Office Open XML文档都实现为ZIP存档。

ECMA-376-1:2016


1我的猜测是,当您有多个工作表时,这种重复数据删除最有效,因为zip压缩独立地应用于存档中的每个文件,并且一次仅应用于数据的有限部分-通过将所有字符串一起存储在单个文件中,应该为以后的压缩带来一些好处。实际上,如果您的纯文本格式仍在单个文件中,则可能几乎没有区别。


2
这很棒!它提供了有关如何处理Excel文件的很好的见解。谢谢!
多米尼克(Dominique)

3
@Dominique如果您想了解更多信息,可以通过解压缩来解决一个问题(例如,使用7zip或重命名,使其以结尾.zip)。也可以使用该规范,但可以使阅读更加干燥。
鲍勃(Bob)

3
我认为excel也使用字符串字典,其中单元格之间相同的文本位可以重复使用,而只存储一次。
布拉德利·乌夫纳

1
基于Apache ooxml库公开的API,至少可能有一个共享字符串字典。
摩根(Morgen)

2
甚至在Excel编写XLS(无x)文件时,共享字符串都是Excel的一项功能,该文件是OLE容器中称为BIFF的面向记录的格式。如果将旧的XLS规范与XLSX进行比较,您会看到XLSX只是BIFF的一个xmlized压缩版本。因此,基本上,MS并未为XLSX发明共享字符串功能,该功能由于压缩而没有多大意义。他们只是将XLS变成XLSX的最简单方法。
Guntram Blohm

2

给出的答案是正确的,这是由于Excel将您的数据存储为xml。也正是由于这个原因,有效地对数据进行排序也会减少文件的大小。自己测试-说您有类似的数据

A            B                              C
John         Smith-Johnson-Williamson       12345
Sally        Smith-Johnson-Williamson       67890
John         Williams                       34567

如果仅按C(具有所有或几乎所有唯一值的列)排序,则B的相同值将不相邻。在Excel的xml中,它看起来像这样:

<12345><John><Smith-Johnson-Williamson>
<34567><John><Williams>
<67890><Sally><Smith-Johnson-Williamson>

如果按B(具有共同值的列)排序,则相同的值相邻。在Excel的xml中,它看起来像这样:

<Smith-Johnson-Williamson><John><12345>
  <Sally><67890>
<Williams><John><34567>

由于该长字符串是相同且相邻的,因此Excel知道它可以将它们打包在一起,就像人们编写列表时一样,并且要重复上述行的一部分,他们使用引号而不是重新编写相同的内容。在调查中,我没有发现共享字符串字典的任何证据-只是此缩进代替了重复的字段值。

我仅在11个州寄出了250,000个客户的邮件列表,每条记录上都有一个字段,该字段是标识他们获得的报价的两个字符串之一。由于某些原因,我们的员工习惯于按口头地址查找人们,因此我们先按要约求助,然后说出:邮政编码,城市,街道名称,街道编号,最后是地址行2,文件大小显着减小。我检查了文件的解压缩xml,以各种方式对其进行了排序,以查看发生了什么,以上就是我得出的结论。如果有多个字段的字符数超过5个,但值是有限的(例如,票证配置为“已解决”,“已拒绝”,“已批准”等),


您好CompanionCube,这是非常了不起的知识。!!! 非常感谢。
user734178

-5

如果您有3.14159265359之类的数字,则需要13个字节才能将其存储在文本文件中;如果将此数字存储为浮点数,则仅需要4个字节。


19
xls(BIFF)可能就是这种情况,但我认为并非xlsx如此。xlsx将所有数据存储在XML文件中,该文件不执行数字二进制编码-它们将转换为文本字符串并存储为文本字符串。我仍在尝试查找规范的相关部分,但我的经验测试(即提取保存的文档)显示,该1.123字符串实际上以5个字符串存储在XML中。
鲍勃

14
ECMA-376-1:2016§18.3.1.4 c(单元格)显示单元格将数据存储在v标签中,如ECMA-376-1:2016§18.3.1.96 v(单元格值)中所定义,其中该元素的可能值由ST_Xstring简单类型(第22.9.2.19节)定义。—它们提供了一些示例,例如<v>28086.3541666667</v>将数据清楚地存储为字符串。
鲍勃·

4
@gerrit 不幸的是, Excel 确实会将数字解释为程序中的浮点数,从而导致有趣的问题,例如电话号码掉到最后几位。它只是不会将它们以浮点数的形式保存到磁盘上(是吗?)。
鲍勃

2
@Bob的情况也是如此xlsb,强烈建议在大张纸上使用
phuclv

2
我不知道为什么这个答案这么多。OP没有指定哪种Excel格式,因此从技术上讲这也是一个有效的答案
phuclv
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.