2017-08-14 6 views
1

J'ai un fichier .xls que je veux imprimer afin d'avoir de jolis fichiers de différences plutôt que de simples fichiers binaires.Décompresser - comment mettre des fichiers gonflés dans un tableau

Mon approche est à unzip toute cette chose. La chaîne résultante ne contient pas de sauts de ligne, donc je l'ai passée par xmllint --format. Mais sur ce chemin apparemment simple, je l'ai rencontré plusieurs problèmes que je l'ai déjà passé des heures:

  1. unzip plusieurs fichiers contenus dans l'archive xml. Cela entraîne un XML incorrect. Même avec unzip -q options je reçois plusieurs DTD et ainsi de suite. xmllint interrompt ceci sans formater l'entrée.

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

  2. J'ai essayé diviser le XML en un tableau en utilisant read afin d'alimenter chaque fichier xml individu à xmllint. Dans le résultat de read la plupart des éléments de tableau semblent être vides et les troisième et quatrième éléments contiennent 20quechoses de la chaîne xml.

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

  3. J'ai essayé également à insérer des sauts de ligne avec sed mais la taille du fichier est si important que le traitement prend trop de temps pour le rendre possible pour diffing.

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

J'ai couru juste d'idées alors j'ai décidé de vous consulter les gars! Merci à l'avance :)

+0

Attention au problème XY. Peut-être jeter un oeil à https://stackoverflow.com/questions/114698/how-do-i-create-a-readable-diff-of-two-spreadsheets-using-git-diff? – Thomas

+0

S'il vous plaît montrer votre code. – hek2mgl

+0

J'ai ajouté le code. –

Répondre

1

Je voudrais extraire le xslx en plusieurs fichiers, les imprimez-les, puis effectuez un diff récursif sur les fichiers xml. (Il y a aussi des fichiers binaires qui ne peuvent pas être mis au format)

comme ceci:

# 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 

Vous pouvez créer la fonction de bash qui enveloppe le processus.

Remarque: Le fichier xlsx déballé peut contenir des fichiers binaires avec la fin .bin. Vous devez les exclure de diff:

diff -urNx '*.bin' foo bar 
+0

Vous êtes l'homme. Merci beaucoup! –

+0

Contente de voir que ça aide – hek2mgl

+0

Avez-vous reçu mon courrier? –

1

Comme vous l'avez déjà constaté, le fichier XLSX contient plus d'un fichier XML, comme spécifié dans le official documentation. En particulier, il y aura un document XML par feuille Excel, ce qui signifie que leur simple combinaison ne sera pas une solution pratique. En plus, vous pouvez également avoir un fichier shared string table dans les fichiers Excel, ce qui signifie que les fichiers de feuilles ne contiennent pas les chaînes d'origine ("Hello, World!"), Mais simplement une référence à la table de chaînes (1234).

En fonction de votre cas d'utilisation, vous pouvez envisager d'autres formats basés sur le texte, tels que CSV.

+0

Merci pour l'information. Apprécié, mais pas la solution que je cherche. –