2017-08-14 4 views
1

Ich habe eine .xls-Datei, die ich hübsch drucken möchte, um nette Diffing zu haben, anstatt nur Binärdateien zu ändern.Unzip - wie setze ich aufgeblähte Dateien in ein Array

Mein Ansatz ist unzip diese ganze Sache. Die resultierende Zeichenfolge enthält keine Zeilenumbrüche, also habe ich sie durch xmllint --format ausgeführt. Aber auf diesem scheinbar einfachen Weg habe ich einige Probleme gestoßen, die ich schon ausgegeben habe Stunden auf:

  1. unzip mehrere Dateien im XML-Archiv. Dies führt zu ungültigem XML. Auch mit unzip -q Optionen bekomme ich mehrere DTDs und so weiter. xmllint unterbricht dies, ohne die Eingabe zu formatieren.

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

  2. ich versuchte, die XML-Daten in ein Array Aufspalten Verwendung read, um jede einzelne XML-Datei xmllint einzuspeisen. Im Ergebnis von read scheinen die meisten Array-Elemente leer zu sein, und das dritte und vierte Element enthalten 20 Buchstaben der XML-Zeichenfolge.

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

  3. Ich habe auch versucht das Einfügen Zeilenumbrüche nur mit sed aber die Dateigröße ist so groß, dass die Verarbeitung es möglich, für die Herstellung von für diffing zu lange dauert.

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

ich die Ideen ausgehen haben gerade so habe ich beschlossen, euch zu beraten! Danke weiter :)

+0

Vorsicht vor dem XY-Problem. Vielleicht werfen Sie einen Blick auf https://stackoverflow.com/questions/114698/how-do-i-create-a-readable-diff-of-two-spreadsheets-using-git-diff? – Thomas

+0

Bitte zeigen Sie Ihren Code. – hek2mgl

+0

Ich habe den Code hinzugefügt. –

Antwort

1

Ich würde die xslx in mehrere Dateien extrahieren, pretty-print sie und dann ein rekursives diff auf den XML-Dateien. (Es gibt auch binäre Dateien, die nicht diffed werden kann)

So:

# 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 

Sie können bash-Funktion erstellen, die den Prozess wickelt.

Hinweis: Die entpackte xlsx-Datei enthält möglicherweise Binärdateien mit der Endung .bin. Sie müssen sie vom Vergleich ausschließen:

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

Du bist der Mann. Vielen Dank! –

+0

Froh, dass es hilft – hek2mgl

+0

Haben Sie meine E-Mail erhalten? –

1

Wie Sie bereits herausgefunden haben, enthält die XLSX-Datei mehr als eine XML-Datei, wie in der angegeben. Insbesondere wird es pro Excel-Tabelle ein XML-Dokument geben, was bedeutet, dass es keine praktische Lösung sein wird, sie zu kombinieren.

Erschwerend kommt hinzu, können Sie auch eine shared string table in Excel-Dateien haben könnte, die die Blatt Dateien selbst bedeutet, dass die Original-Zeichenketten nicht enthalten („Hallo, Welt!“), Sondern nur ein Verweis auf die String-Tabelle (1234).

Je nach Anwendungsfall sollten Sie mehr textbasierte Formate wie CSV berücksichtigen.

+0

Vielen Dank für die Informationen. Geschätzt, aber nicht die Lösung, nach der ich suche. –