Почему одни и те же данные занимают больше места в текстовом файле, чем в файле Excel?

59

У меня есть около 100000 строк данных. Если я храню эти данные в формате текстового файла, это занимает больше места, чем если бы я сохранял их в формате файла Excel. Почему это?

user734178
источник

Ответы:

117

xlsxФормат , используемый современной Excel на самом деле сжатый формат. Это ZIP-архив, который содержит текстовые (XML) файлы в определенной структуре.

Если вы сжимаете ваш простой текстовый файл с помощью аналогичного инструмента сжатия ZIP, вы должны достичь аналогичных размеров файлов.

Кроме того, как упомянули Брэдли Аффнер и Морген в комментариях, Excel будет дедуплицировать идентичные строки и хранить только одну их копию. Я не уверен в точных преимуществах такого метода, и он будет зависеть от вашего набора данных, но простое сжатие zip, вероятно, поможет вам в этом. 1


9.1.3 Физические пакеты

Каждый документ Office Open XML реализован в виде ZIP-архива.

- ECMA-376-1: 2016


1 Я предполагаю, что эта дедупликация наиболее эффективна, когда у вас есть несколько рабочих листов, поскольку сжатие zip применяется независимо к каждому файлу в архиве и только к ограниченным разделам данных за один раз - сохраняя все строки вместе в одном файле, должно быть какое-то преимущество для последующего сжатия. С практической точки зрения, если ваш простой текстовый формат находится в одном файле, то, вероятно, будет небольшая разница.

боб
источник
2
Это здорово! Это дает очень хорошее понимание того, как обрабатываются файлы Excel. Спасибо!
Доминик
3
@Dominique Если вы хотите узнать больше, вы можете поиграть с ним, разархивировав его (например, с помощью 7zip или переименовав его так, чтобы он заканчивался .zip). Спецификация также доступна, но это делает для довольно сухого чтения.
Боб
3
Я думаю, что Excel также использует строковый словарь, в котором биты текста, идентичные между ячейками, можно использовать повторно, сохраняя только один раз.
Брэдли Аффнер
1
Основанный на API, предоставляемом библиотекой Apache ooxml, словарь общих строк, по крайней мере, вероятен.
Морген
2
Совместно используемые строки были функцией Excel даже тогда, когда он писал файлы XLS (без x), которые представляли собой ориентированный на записи формат, называемый BIFF в контейнере OLE. Если вы сравните старые спецификации XLS с XLSX, вы увидите, что XLSX - это просто улучшенная XML-версия BIFF. Так что, в сущности, MS не изобрела функцию общей строки для XLSX, где она не имеет особого смысла из-за сжатия; они просто пошли самым простым путем, чтобы превратить XLS в XLSX.
Гунтрам Блом поддерживает Монику
2

Ответ правильный, это связано с тем, что Excel хранит ваши данные в формате XML. Это также связано с тем, что эффективная сортировка данных также уменьшит размер файла. Проверьте сами - скажем, у вас есть данные, как

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

Если вы сортируете только по C (столбец со всеми или почти всеми уникальными значениями), то идентичные значения B не будут смежными. В Excel Excel это выглядит так:

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

Если вы сортируете по B (столбец с общими значениями), то идентичные значения являются смежными. В Excel Excel это выглядит так:

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

Поскольку эта длинная строка идентична и смежна, Excel знает, что она может упаковать их вместе, подобно тому, как люди пишут списки, и для повторения части вышеупомянутой строки они пишут кавычки, а не переписывают одно и то же. В моем исследовании я не нашел никаких доказательств наличия словаря с общими строками - только этот отступ вместо повторяющегося значения поля.

У меня были списки рассылки 250 000 клиентов только в 11 штатах, и в каждой записи было поле, которое было одной из двух строк, определяющих предложение, которое они получают. Наши сотрудники по какой-то причине привыкли искать людей по их названию улицы, так как они были отсортированы по столбцу номера улицы, затем по названию улицы, городу и т. Д., Когда я сначала прибегнул к предложению, а затем указал, почтовый индекс, город, название улицы, номер улицы и, наконец, адрес-строка-2, размер файла был невероятно уменьшен. Я проверил распакованный xml на файле, отсортированном в каждом случае, чтобы увидеть, что происходит, и вышеизложенное - то, что я вывел. Если есть несколько полей с более чем, скажем, 5 символами, но значения имеют ограниченный набор (скажем, расположение заявок, таких как «разрешен», «отклонен», «утвержден» и т. Д.),

CompanionCube
источник
Привет 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
Я не знаю, почему этот ответ получает так много отрицательных отзывов. ОП не указал, какой формат Excel, так что технически это тоже правильный ответ
phuclv