60 votes

Pourquoi les mêmes données prennent-elles plus de place dans un fichier texte que dans un fichier Excel ?

J'ai environ 100 000 lignes de données. Si je stocke ces données dans un format de fichier texte, elles prennent plus de place que si je les stocke dans un format de fichier Excel. Comment cela se fait-il ?

118voto

Bob Points 58080

En xlsx format utilisé par Excel moderne est en fait un format compressé. Il s'agit d'une archive ZIP qui contient des fichiers texte (XML) dans une certaine structure.

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

De plus, comme le mentionne Bradley Uffner y Morgen dans les commentaires, Excel va dédupliquer identique et n'en conserver qu'une seule copie. Je ne suis pas sûr des gains exacts d'une telle méthode, et cela dépendra de votre ensemble de données, mais une simple compression zip vous permettra probablement de faire une bonne partie du chemin. 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 Je pense 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 seulement sur des sections limitées des données à la fois - en stockant toutes les chaînes de caractères ensemble dans un seul fichier, il devrait y avoir un certain avantage à la compression ultérieure. De manière plus pratique, si votre format de texte brut se trouve de toute façon dans un seul fichier, il y aura probablement peu de différence.

2voto

CompanionCube Points 21

La réponse donnée est correcte, cela est dû au fait qu'Excel stocke vos données au format xml. C'est également pour cette raison que le fait de trier efficacement vos données réduira également la taille du fichier. Testez-le vous-même - disons que vous avez des données comme

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), alors les valeurs identiques de B ne seront pas adjacentes. Dans le xml d'Excel, 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), alors les valeurs identiques sont adjacentes. Dans le xml d'Excel, cela ressemble à ceci :

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

Parce que 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 tapent des guillemets plutôt que 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 indentation à la place de la valeur répétée du champ.

J'avais des listes de diffusion de 250 000 clients répartis dans seulement 11 États, et sur chaque enregistrement il y avait un champ qui était l'une des deux chaînes identifiant l'offre qu'ils reçoivent. Nos employés étaient, pour une raison ou une autre, habitués à rechercher les gens par leur adresse de rue, de sorte que le fichier était trié sur la colonne du numéro de rue, puis le nom de la rue, la ville, etc... lorsque j'ai effectué un tri par l'offre d'abord, puis l'état, le code postal, la ville, le nom de la rue, le numéro de rue, et enfin la ligne d'adresse 2, la taille du fichier a été incroyablement réduite. J'ai examiné le xml décompressé sur le fichier trié de chaque façon pour voir ce qui se passait, et ce qui précède est ce que j'ai déduit. S'il y a plusieurs champs avec plus de 5 caractères, par exemple, mais que les valeurs sont d'un ensemble limité (par exemple, des dispositions de ticket comme "résolu", "rejeté", "approuvé", etc), alors pensez au tri et voyez si cela peut aider.

-5voto

Mirko Ebert Points 213

Si vous avez un nombre comme 3.14159265359, vous avez besoin de 13 octets pour le stocker dans un fichier texte ; si vous stockez ce nombre sous forme de flottant, vous n'avez besoin que de 4 octets.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X