Descomprimir – ¿cómo pongo los files inflados en una matriz

Tengo un file .xls que quiero imprimir bastante para poder cambiar los files binarys en lugar de simplemente binarys.

Mi enfoque es unzip todo esto. La cadena resultante no contiene linebreaks, así que la ejecuté a través de xmllint --format . Pero en este path aparentemente simple, he encontrado varios problemas en los que ya he pasado horas:

  1. unzip varios files dentro del file xml. Esto da como resultado xml no válido. Incluso con las opciones de unzip -q obtengo DTD múltiples, y así sucesivamente. xmllint se rompe en esto sin formatear la input.

    unzip -c -a -q myFile.xlsx | xmllint --format -

  2. Traté de dividir el XML en una matriz usando read para alimentar cada file xml individual a xmllint. En el resultado de read mayoría de los elementos de la matriz parecen estar vacíos y el tercer y cuarto elemento contienen 20 letras de la cadena xml.

    IFS='\<\?xml' read -r -a files <<< "$decompressed"

  3. También traté de insert linebreaks con sed pero el tamaño del file es tan grande que el process lleva demasiado time para que sea posible modificarlo.

    ${decompressed/\>\</\>\n\</g}

Me acabo de quedar sin ideas, ¡así que decidí consultarlos! Gracias a continuación 🙂

Extraería el xslx en varios files, imprimímoslos y luego hacemos una diferencia recursiva en los files xml. (También hay files binarys que no se pueden diferir)

Me gusta esto:

 # Unzip the xlsx files into folders unzip -aqd foo foo.xlsx unzip -aqd bar bar.xlsx # Pretty print all .xml and .rels files find foo bar \( -name '*.xml' -o -name '*.rels' \) -exec xmllint --format {} --output {} \; # Now you can recursively diff them diff -urN foo bar 

Puede crear la function bash que envuelve el process.

Nota: El file xlsx desempaquetado puede contener files binarys con terminación .bin . Debe excluirlos de diff:

 diff -urNx '*.bin' foo bar 

Como ya descubrió, el file XLSX contiene más de un file XML, como se especifica en la documentation oficial . En particular, habrá un documento XML por hoja de Excel, lo que significa que simplemente combinarlos no será una solución práctica.

Para empeorar las cosas, también puede tener una tabla de cadenas compartida en files de Excel, lo que significa que los propios files de hoja no contendrán las cadenas originales ("¡Hola, mundo!"), Sino solo una reference a la tabla de cadenas (1234) .

Dependiendo de su caso de uso, es posible que desee considerar más formattings basados ​​en text como CSV .