¿Por qué los mismos datos ocupan más espacio en un archivo de texto que en un archivo de Excel?

59

Tengo alrededor de 100000 filas de datos. Si almaceno estos datos en un formato de archivo de texto, ocupa más espacio que si los almaceno en un formato de archivo de Excel. ¿Porqué es eso?

usuario734178
fuente

Respuestas:

117

El xlsxformato utilizado por Excel moderno es en realidad un formato comprimido. Es un archivo ZIP que contiene archivos de texto (XML) en una determinada estructura.

Si comprime su archivo de texto sin formato con una herramienta de compresión ZIP similar, debe lograr tamaños de archivo similares.

Además, como lo mencionaron Bradley Uffner y Morgen en los comentarios, Excel deduplicará cadenas idénticas y solo almacenará una copia de ellas. No estoy seguro de las ganancias exactas de un método de este tipo, y dependerá de su conjunto de datos, pero la simple compresión zip probablemente lo llevará a la mayor parte del camino. 1


9.1.3 Paquetes físicos

Cada documento de Office Open XML se implementa como un archivo ZIP.

- ECMA-376-1: 2016


1 Supongo que esta deduplicación es más efectiva cuando tiene varias hojas de trabajo, ya que la compresión zip se aplica de forma independiente a cada archivo en un archivo y solo en secciones limitadas de los datos a la vez, almacenando todas las cadenas juntas en un solo archivo. Debería haber algún beneficio para la compresión posterior. Más prácticamente, si su formato de texto plano está en un solo archivo de todos modos, entonces probablemente habrá poca diferencia.

Mover
fuente
2
¡Esto es genial! Da una muy buena idea de cómo se manejan los archivos de Excel. ¡Gracias!
Dominique
3
@Dominique Si desea saber más, puede jugar con uno descomprimiéndolo (por ejemplo, con 7zip, o renombrándolo para que termine en .zip). La especificación también está disponible, pero es una lectura bastante seca.
Bob
3
Creo que Excel también usa un diccionario de cadenas, donde los bits de texto que son idénticos entre las celdas pueden reutilizarse mientras solo se almacenan una vez.
Bradley Uffner
1
Basado en la API expuesta por la biblioteca Apache ooxml, un diccionario de cadenas compartidas es al menos probable.
Morgen
2
Las cadenas compartidas eran una característica de Excel incluso cuando escribía archivos XLS (no x), que eran un formato orientado a registros llamado BIFF dentro de un contenedor OLE. Si compara las antiguas especificaciones XLS con XLSX, verá que XLSX es solo una versión comprimida xmlified asciified de BIFF. Básicamente, MS no inventó la función de cadena compartida para XLSX, donde no tiene mucho sentido debido a la compresión; simplemente tomaron la ruta más fácil para convertir XLS en XLSX.
Guntram Blohm apoya a Monica el
2

La respuesta dada es correcta, se debe a que Excel almacena sus datos como xml. También se debe a esto, que ordenar sus datos de manera eficiente también reducirá el tamaño del archivo. Pruébelo usted mismo: suponga que tiene datos como

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

Si ordena por C (una columna con todos o casi todos los valores únicos) solamente, los valores idénticos de B no serán adyacentes. En el xml de Excel se ve así:

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

Si ordena por B (una columna con valores comunes), los valores idénticos son adyacentes. En el xml de Excel se ve así:

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

Debido a que esa cadena larga es idéntica y adyacente, Excel sabe que puede agruparlos, de manera similar a cuando las personas escriben listas, y para repetir parte de la línea anterior, escriben comillas en lugar de volver a escribir lo mismo. No encontré ninguna evidencia de un diccionario de cadenas compartidas en mi investigación, solo esta sangría en lugar del valor de campo repetido.

Tenía listas de correo de 250,000 clientes en solo 11 estados, y en cada registro había un campo que era una de las dos cadenas que identificaban la oferta que recibían. Nuestros empleados, por alguna razón, estaban acostumbrados a buscar a las personas por su dirección de la calle tal como se hablaba, por lo que se ordenó en la columna del número de la calle, luego el nombre de la calle, la ciudad, etc. código postal, ciudad, nombre de la calle, número de la calle y finalmente dirección-línea-2, el tamaño del archivo se redujo increíblemente. Examiné el xml desempaquetado en el archivo ordenado en cada sentido para ver qué estaba pasando, y lo anterior es lo que deduje. Si hay varios campos con más de 5 caracteres, pero los valores son de un conjunto limitado (por ejemplo, disposiciones de tickets como 'resuelto', 'rechazado', 'aprobado', etc.),

CompanionCube
fuente
Hola CompanionCube, este es un conocimiento extremadamente increíble. !!! Muchas gracias.
user734178
-5

Si tiene un número como 3.14159265359, necesita 13 bytes para almacenarlo en un archivo de texto; Si almacena este número como flotante, solo necesita 4 bytes.

Mirko Ebert
fuente
19
Si bien este podría haber sido el caso con xls(BIFF), no creo que lo xlsxhaga. xlsxalmacena todos los datos en archivos XML, que no realizan codificación binaria de números; se convierten y almacenan como cadenas de texto. Todavía estoy tratando de buscar la sección relevante de la especificación, pero mi prueba empírica (es decir, extraer un documento guardado) muestra que 1.123se almacena literalmente como una cadena de 5 caracteres en XML.
Bob
14
ECMA-376-1: 2016 § 18.3.1.4 c(Celda) muestra que las celdas almacenan sus datos en vetiquetas, tal como se define en ECMA-376-1: 2016 § 18.3.1.96 v(Valor de celda) donde dicen Los valores posibles para este elemento están definidos por el tipo simple ST_Xstring (§22.9.2.19). - proporcionan ejemplos como <v>28086.3541666667</v>dónde los datos se almacenan claramente como una cadena.
Bob
44
@gerrit Desafortunadamente Excel no interpretar los números como flotadores dentro del programa, lo que lleva a problemas interesantes como números de teléfono que abandonan los últimos dígitos. Simplemente no los guarda en el disco como flotantes (¿ya?).
Bob
2
@Bob esto también es el caso de xlsb, que es muy recomendable para grandes hojas
phuclv
2
No sé por qué esta respuesta recibe tantos votos negativos. El OP no especificó qué formato de Excel, por lo que técnicamente esta también es una respuesta válida
phuclv