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

use*_*178 60 text-editing microsoft-excel

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

Bob*_*Bob 118

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

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

此外,正如Bradley UffnerMorgen在评论中所提到的,Excel 将对相同的字符串进行重复数据删除,并且只存储它们的一个副本。我不确定这种方法的确切收益,这将取决于您的数据集,但简单的 zip 压缩可能会让您获得大部分收益。1


9.1.3 物理包

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

ECMA-376-1:2016


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

  • @Dominique 如果您想了解更多信息,可以通过解压缩(例如使用 7zip,或将其重命名以使其以 `.zip` 结尾)来尝试一下。该规范也可用,但它使阅读变得相当枯燥。 (3认同)
  • 我认为 excel 还使用字符串字典,其中单元格之间相同的文本位可以重复使用,而只能存储一次。 (3认同)
  • 这很棒!它可以很好地了解 Excel 文件的处理方式。谢谢! (2认同)
  • 共享字符串是 Excel 的一个功能,甚至在它编写 XLS(无 x)文件时也是如此,这是一种在 OLE 容器中称为 BIFF 的面向记录的格式。如果您将旧的 XLS 规范与 XLSX 进行比较,您会发现 XLSX 只是 BIFF 的 asciified xmlified 压缩版本。所以基本上 MS 没有为 XLSX 发明共享字符串功能,由于压缩,它没有多大意义;他们只是采用了将 XLS 转换为 XLSX 的最简单方法。 (2认同)

Mir*_*ert -3

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

  • 虽然“xls”(BIFF)可能就是这种情况,但我不认为“xlsx”会这样做。 “xlsx”将所有数据存储在 XML 文件中,这些数据不执行数字的二进制编码 - 它们被转换为文本字符串并存储。我仍在尝试查找规范的相关部分,但我的经验测试(即提取已保存的文档)显示“1.123”实际上是作为 XML 中的 5 个字符的字符串存储的。 (19认同)
  • *ECMA-376-1:2016 § 18.3.1.4 `c` (Cell)* 显示单元将其数据存储在 `v` 标签中,如 *ECMA-376-1:2016 § 18.3.1.96 `v` ( Cell Value)* 他们说 *该元素的可能值由 ST_Xstring 简单类型 (§22.9.2.19) 定义。* - 他们提供了诸如“<v>28086.3541666667</v>”之类的示例,其中数据清楚地显示存储为字符串。 (14认同)
  • @gerrit *不幸的是* Excel *确实*在程序中将数字解释为浮点数,从而导致有趣的问题,例如电话号码删除最后几位数字。它只是不再将它们作为浮点数保存到磁盘上(不再?)。 (4认同)
  • @Bob 这也是“xlsb”的情况,强烈推荐用于大纸张 (2认同)
  • 我不知道为什么这个答案得到这么多反对票。 OP 没有指定哪种 Excel 格式,因此从技术上讲,这也是一个有效的答案 (2认同)
  • @LưuVĩnhPhúc 不是一个反对者,但是:它还假设行主要是数字。至少可以说,并对此做了相当简单的解释。 (2认同)
  • 无论如何[Excel总是使用双精度](https://en.wikipedia.org/wiki/Numeric_ precision_in_Microsoft_Excel),而不是浮点数。 https://msdn.microsoft.com/en-us/library/bb687844.aspx (2认同)