Dlaczego te same dane zajmują więcej miejsca w pliku tekstowym niż w pliku Excel?

59

Mam około 100 000 wierszy danych. Jeśli przechowuję te dane w formacie pliku tekstowego, zajmuje to więcej miejsca, niż jeśli przechowuję je w formacie pliku Excel. Dlaczego?

użytkownik734178
źródło

Odpowiedzi:

118

xlsxFormat używany przez nowoczesną Excel jest faktycznie w formacie skompresowanym. Jest to archiwum ZIP, które zawiera pliki tekstowe (XML) w określonej strukturze.

Jeśli kompresujesz plik zwykłego tekstu za pomocą podobnego narzędzia do kompresji ZIP, powinieneś osiągnąć podobne rozmiary plików.

Ponadto, jak wspomniano w komentarzach Bradley Uffner i Morgen , Excel deduplikuje identyczne ciągi i przechowuje tylko jedną ich kopię. Nie jestem pewien dokładnych korzyści z takiej metody i będzie to zależeć od twojego zestawu danych, ale zwykła kompresja zip prawdopodobnie zapewni ci większość możliwości. 1


9.1.3 Paczki fizyczne

Każdy dokument Office Open XML jest implementowany jako archiwum ZIP.

- ECMA-376-1: 2016


1 Domyślam się, że ta deduplikacja jest najskuteczniejsza, gdy masz wiele arkuszy, ponieważ kompresja zip stosuje się niezależnie do każdego pliku w archiwum i tylko w ograniczonych sekcjach danych na raz - przechowując wszystkie ciągi razem w jednym pliku, tam powinno być korzystne dla późniejszej kompresji. Praktycznie, jeśli twój zwykły format tekstowy jest w jednym pliku, prawdopodobnie nie będzie różnicy.

Kok
źródło
2
To jest świetne! Daje to bardzo dobry wgląd w sposób obsługi plików Excel. Dzięki!
Dominique
3
@Dominique Jeśli chcesz dowiedzieć się więcej, możesz pobawić się jednym z nich, rozpakowując go (np. Za pomocą 7zip lub zmieniając jego nazwę tak, aby się skończyła .zip). Specyfikacja jest również dostępna, ale umożliwia raczej suche czytanie.
Bob
3
Myślę, że excel używa również słownika łańcuchowego, w którym fragmenty tekstu, które są identyczne między komórkami, mogą być ponownie użyte, gdy są przechowywane tylko raz.
Bradley Uffner
1
Oparty na interfejsie API ujawnionym przez bibliotekę Apox ooxml, słownik wspólnych ciągów jest co najmniej prawdopodobny.
Morgen
2
Udostępniane ciągi były funkcją programu Excel nawet wtedy, gdy zapisywał pliki XLS (bez x), które były formatem zorientowanym na rekordy o nazwie BIFF w kontenerze OLE. Jeśli porównasz stare specyfikacje XLS z XLSX, zobaczysz, że XLSX to po prostu rozbudowana wersja BIFF w formacie zip. Tak więc w zasadzie MS nie wymyśliło funkcji wspólnego łańcucha dla XLSX, gdzie nie ma to większego sensu z powodu kompresji; właśnie wybrali najłatwiejszą drogę do przekształcenia XLS w XLSX.
Guntram Blohm
2

Podana odpowiedź jest prawidłowa, ponieważ program Excel przechowuje dane w formacie xml. Jest to również spowodowane tym, że wydajne sortowanie danych zmniejszy również rozmiar pliku. Sprawdź to sam - powiedz, że masz takie dane

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

Jeśli sortujesz według C (kolumna zawierająca wszystkie lub prawie wszystkie unikalne wartości), wówczas identyczne wartości B nie będą sąsiadować. W xml Excela wygląda to tak:

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

Jeśli sortujesz według B (kolumna ze wspólnymi wartościami), wówczas identyczne wartości sąsiadują. W xml Excela wygląda to tak:

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

Ponieważ ten długi ciąg znaków jest identyczny i sąsiaduje z nim, Excel wie, że może je spakować razem, podobnie jak w przypadku, gdy ludzie piszą listy i aby powtórzyć część powyższej linii, zamiast cudzysłowu wpisują cudzysłowy. W trakcie mojego dochodzenia nie znalazłem żadnych dowodów na słownik ze wspólnym ciągiem - po prostu to wcięcie zamiast powtarzanej wartości pola.

Miałem listy mailingowe 250 000 klientów tylko w 11 stanach, a przy każdym rekordzie znajdowało się pole, które było jednym z dwóch ciągów identyfikujących otrzymaną ofertę. Nasi pracownicy byli z jakiegoś powodu przyzwyczajeni do szukania ludzi według ich adresu, tak jak mówiono, więc został on posortowany według kolumny z numerem ulicy, potem nazwy ulicy, miasta itp., Kiedy najpierw skorzystałem z oferty, a następnie podałem, kod pocztowy, miasto, nazwa ulicy, numer ulicy i wreszcie adres-linia-2, rozmiar pliku został niesamowicie zmniejszony. Sprawdziłem rozpakowany plik xml w pliku posortowanym w każdy sposób, aby zobaczyć, co się dzieje, i powyższe wywnioskowałem. Jeśli istnieje wiele pól zawierających więcej niż powiedzmy 5 znaków, ale wartości mają ograniczony zestaw (powiedzmy, dyspozycje biletów, takie jak „rozwiązany”, „odrzucony”, „zatwierdzony” itp.),

CompanionCube
źródło
Witaj CompanionCube, To jest niesamowita wiedza. !!! Dziękuję bardzo.
user734178,
-5

Jeśli masz liczbę taką jak 3.14159265359, potrzebujesz 13 bajtów, aby zapisać to w pliku tekstowym; jeśli przechowujesz ten numer jako liczbę zmiennoprzecinkową, potrzebujesz tylko 4 bajtów.

Mirko Ebert
źródło
19
Chociaż mogło tak być w przypadku xls(BIFF), nie sądzę, aby xlsxtak było. xlsxprzechowuje wszystkie dane w plikach XML, które nie wykonują binarnego kodowania cyfr - są one konwertowane i zapisywane jako ciągi tekstowe. Wciąż próbuję znaleźć odpowiednią sekcję specyfikacji, ale moje testy empiryczne (tj. Wyodrębnienie zapisanego dokumentu) pokazują, że 1.123dosłownie jest przechowywany jako ciąg 5 znaków w XML.
Bob
14
ECMA-376-1: 2016 § 18.3.1.4 c(Komórka) pokazuje, że komórki przechowują swoje dane w vtagach, zgodnie z definicją w ECMA-376-1: 2016 § 18.3.1.96 v(Komórka), gdzie mówią Możliwe wartości tego elementu są zdefiniowane przez prosty typ ST_Xstring (§22.9.2.19). - podają przykłady takich <v>28086.3541666667</v>przypadków, w których dane są wyraźnie przechowywane jako ciąg.
Bob
4
@gerrit Niestety Excel ma interpretować jako numery pływaków w ramach programu, co prowadzi do ciekawych problemów, takich jak numery telefonów spada kilka ostatnich cyfr. Po prostu nie zapisuje ich na dysku jako zmiennoprzecinkowe (już?).
Bob
2
@Bob jest to również przypadek xlsb, który jest wysoce zalecany do dużych arkuszy
phuclv
2
Nie wiem, dlaczego ta odpowiedź ma tyle głosów negatywnych. OP nie określił, który format Excela, więc technicznie jest to również poprawna odpowiedź
phuclv