Чому ті ж дані займають більше місця в текстовому файлі, ніж у файлі Excel?


59

У мене є близько 100000 рядків даних. Якщо я зберігаю ці дані у форматі текстового файлу, це займає більше місця, ніж якщо я зберігаю їх у форматі файлу Excel. Чому так?

Відповіді:


118

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 - це лише асцифікована xmlified zipped версія BIFF. Таким чином, 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 не будуть суміжними. У xml Excel це виглядає приблизно так:

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

Якщо сортувати за B (стовпець із загальними значеннями), то однакові значення суміжні. У xml Excel це виглядає приблизно так:

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

Оскільки ця довга струна є однаковою та сусідньою, Excel знає, що може складати їх разом, як коли люди пишуть списки, і щоб повторити частину вищевказаного рядка, вони вводять лапки, а не переписують те саме. Я не знайшов жодних доказів словника спільних рядків у своєму дослідженні - просто це відступ замість повторного значення поля.

У мене були списки розсилки 250 000 клієнтів лише у 11 штатах, і на кожному записі було поле, яке було одним із двох рядків, що визначають пропозицію, яку вони отримують. Наші працівники чомусь звикли шукати людей за адресою вулиці так, як розмовляли, тому це було відсортовано за стовпчиком номера вулиці, потім назвою вулиці, містом тощо ... коли я звертався за пропозицією спочатку, потім штат, поштовий індекс, місто, назва вулиці, номер вулиці та нарешті адреса-рядок-2, розмір файлу був зменшений неймовірно. Я вивчив розпакований XML у файлі, відсортований кожен спосіб, щоб побачити, що відбувається, і вище, що я вивів. Якщо є кілька полів, що містять більше 5 символів, але значення мають обмежений набір (скажімо, диспозиції білетів типу "вирішено", "відхилено", "затверджено" тощо),


Привіт CompanionCube, це надзвичайно приголомшливі знання. !!! Дуже дякую.
користувач734178

-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(Cell) показує, що клітини зберігають свої дані в 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
Я не знаю, чому ця відповідь отримує стільки зворотних відгуків. ОП не
вказала,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.