Pourquoi les mêmes données occupent-elles plus d'espace dans un fichier texte que dans un fichier Excel?

59

J'ai environ 100 000 lignes de données. Si je stocke ces données dans un format de fichier texte, cela prend plus d'espace que si je les stocke dans un format de fichier Excel. Pourquoi donc?

utilisateur734178
la source

Réponses:

117

Le xlsxformat utilisé par Excel moderne est en fait un format compressé. C'est une archive ZIP qui contient des fichiers texte (XML) dans une certaine structure.

Si vous compressez votre fichier texte brut avec un outil de compression ZIP similaire, vous devez obtenir des tailles de fichier similaires.

En outre, comme mentionné par Bradley Uffner et Morgen dans les commentaires, Excel dédupliquera les chaînes identiques et n'en stockera qu'une copie. Je ne suis pas sûr des avantages exacts d'une telle méthode, et cela dépendra de votre ensemble de données, mais une simple compression zip vous y conduira probablement en majeure partie. 1


9.1.3 Paquets physiques

Chaque document Office Open XML est implémenté sous la forme d'une archive ZIP.

- ECMA-376-1: 2016


1 Mon hypothèse est que cette déduplication est plus efficace lorsque vous avez plusieurs feuilles de calcul, car la compression zip s'applique indépendamment à chaque fichier d'une archive et uniquement sur un nombre limité de données à la fois - en stockant toutes les chaînes ensemble dans un seul fichier, il devrait être un avantage pour la compression ultérieure. Plus concrètement, si votre format de texte brut est de toute façon dans un seul fichier, il y aura probablement peu de différence.

Bob
la source
2
C'est bien! Cela donne une très bonne idée de la manière dont les fichiers Excel sont gérés. Merci!
Dominique
3
@Dominique Si vous voulez en savoir plus, vous pouvez en jouer avec un en le décompressant (par exemple avec 7zip ou en le renommant pour qu'il se termine .zip). La spécification est également disponible, mais elle rend la lecture plutôt sèche.
Bob
3
Je pense que Excel utilise également un dictionnaire de chaînes de caractères, dans lequel des bits de texte identiques entre cellules peuvent être réutilisés s'ils ne sont stockés qu'une seule fois.
Bradley Uffner
1
Basé sur l'API exposée par la bibliothèque Apache ooxml, un dictionnaire de chaînes partagées est au moins probable.
Morgen
2
Les chaînes partagées étaient une fonctionnalité d'Excel même quand elle écrivait des fichiers XLS (pas de x), qui étaient un format orienté enregistrement appelé BIFF dans un conteneur OLE. Si vous comparez les anciennes spécifications XLS à XLSX, vous constaterez que XLSX est simplement une version compressée xmlifiée de BIFF. Donc, fondamentalement, MS n’a pas inventé la fonctionnalité de chaîne partagée pour XLSX, qui n’a pas beaucoup de sens en raison de la compression; ils ont juste choisi la voie la plus facile pour transformer XLS en XLSX.
Guntram Blohm soutient Monica le
2

La réponse donnée est correcte, cela est dû au fait que Excel stocke vos données au format xml. C’est également pour cette raison que le tri efficace de vos données réduira également la taille du fichier. Testez-le vous-même - dites que vous avez des données telles que

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

Si vous triez uniquement par C (une colonne avec toutes ou presque toutes les valeurs uniques), les valeurs identiques de B ne seront pas adjacentes. Dans Excel XML, cela ressemble à ceci:

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

Si vous triez par B (une colonne avec des valeurs communes), les valeurs identiques sont adjacentes. Dans Excel XML, cela ressemble à ceci:

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

Comme cette longue chaîne est identique et adjacente, Excel sait qu'il peut les regrouper, comme lorsque les gens écrivent des listes, et pour répéter une partie de la ligne ci-dessus, ils tapaient des guillemets au lieu de réécrire la même chose. Je n'ai trouvé aucune preuve d'un dictionnaire de chaînes partagées dans mon enquête - juste cette mise en retrait à la place de la valeur de champ répété.

J'avais des listes de diffusion de 250 000 clients dans seulement 11 États et, sur chaque enregistrement, il y avait un champ qui était l'une des deux chaînes identifiant l'offre reçue. Nos employés étaient pour une raison quelconque habitués à rechercher des personnes par leur adresse postale telle qu'elle était parlée. Elle a donc été triée dans la colonne numéro de rue, puis le nom de la rue, la ville, etc. code postal, ville, nom de rue, numéro de rue, et enfin adresse-ligne-2, la taille du fichier a été réduite de façon incroyable. J'ai examiné le fichier XML non décompressé dans le fichier, trié dans chaque sens pour voir ce qui se passait, et ce qui précède est ce que j'ai déduit. S'il existe plusieurs champs de plus de 5 caractères, mais que les valeurs correspondent à un ensemble limité (par exemple, les dispositions de ticket telles que "résolu", "rejeté", "approuvé", etc.),

CompanionCube
la source
Bonjour CompanionCube, C'est une connaissance extrêmement impressionnante. !!! Merci beaucoup.
user734178
-5

Si vous avez un numéro comme 3.14159265359, vous avez besoin de 13 octets pour le stocker dans un fichier texte. si vous stockez ce nombre en tant que float, vous n'avez besoin que de 4 octets.

Mirko Ebert
la source
19
Bien que cela ait pu être le cas avec xls(BIFF), je ne pense pas que xlsxce soit le cas. xlsxstocke toutes les données dans des fichiers XML qui n'effectuent pas de codage binaire des chiffres. Elles sont converties et stockées sous forme de chaînes de texte. J'essaie toujours de traquer la section pertinente de la spécification, mais mes tests empiriques (c'est-à-dire l'extraction d'un document enregistré) montrent que celui-ci 1.123est littéralement stocké sous la forme d'une chaîne de 5 caractères au format XML.
Bob
14
La norme ECMA-376-1: 2016, § 18.3.1.4 c(cellule) indique que les cellules stockent leurs données dans des vbalises, comme défini dans la norme ECMA-376-1: 2016, § 18.3.1.96 v(valeur de cellule) où elles indiquent les valeurs possibles pour cet élément. sont définis par le type simple ST_Xstring (§22.9.2.19). - ils fournissent des exemples, par exemple, <v>28086.3541666667</v>où les données sont clairement stockées sous forme de chaîne.
Bob
4
@gerrit Malheureusement Excel n'interpréter le nombre de flotteurs au sein du programme, ce qui conduit à des problèmes intéressants comme les numéros de téléphone laissant tomber les derniers chiffres. Cela ne les sauvegarde pas sur le disque en tant que flottants (plus?).
Bob
2
@Bob c'est également le cas pour xlsb, ce qui est fortement recommandé pour les grandes feuilles
phuclv
2
Je ne sais pas pourquoi cette réponse reçoit autant de votes négatifs. Le PO n'a pas précisé le format Excel si techniquement, c'est aussi une réponse valable
phuclv