2017-08-14 78 views
1

我有一個.xls文件,我想打印出漂亮的文件,以便更好地區分文件,而不僅僅是更改二進制文件。解壓 - 如何將充氣文件放入數組

我的做法是unzip這整件事。結果字符串不包含換行符,所以我通過xmllint --format運行它。但是,這個看似簡單的道路上我也遇到過,我已經上花了幾個小時幾個問題:

  1. unzip的XML存檔中的多個文件。這導致無效的xml。即使有unzip -q選項,我也會獲得多個DTD等。沒有格式化輸入xmllint打破了。

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

  2. 我試圖分裂成XML以飼料每個單獨的XML文件來xmllint使用read陣列。在read的結果中,大部分數組項似乎都是空的,第三和第四項包含20個xml字符串的字母。

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

  3. 我也嘗試了將換行與sed,但文件大小是如此之大,處理時間過久使之成爲可行的版本比較。

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

我剛纔已經江郎才盡了,所以我決定給你諮詢的傢伙!謝謝提前:)

+0

請注意XY問題。也許看看https://stackoverflow.com/questions/114698/how-do-i-create-a-readable-diff-of-two-spreadsheets-using-git-diff? – Thomas

+0

請顯示您的代碼。 – hek2mgl

+0

我添加了代碼。 –

回答

1

我會將xslx解壓縮爲多個文件,然後將它們打印出來,然後對xml文件進行遞歸比較。 (也有不能顯示差異的二進制文件)

像這樣:

# 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 

您可以創建一個包裝過程bash函數。

注意:解壓後的xlsx文件可能包含帶有.bin結尾的二進制文件。您需要從差異中排除它們:

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

你是男人。非常感謝你! –

+0

很高興看到它有幫助 – hek2mgl

+0

您收到我的郵件了嗎? –

1

正如您已經發現的那樣,XLSX文件包含多個XML文件,如official documentation中所述。特別是,每張Excel表格都會有一個XML文檔,這意味着只需將它們結合起來就不是一個實際的解決方案。

更糟糕的是,您也可能在Excel文件中有shared string table,這意味着工作表文件本身將不包含原始字符串(「Hello,World!」),而只是對字符串表的引用( 1234)。

根據您的使用情況,您可能需要考慮更多基於文本的格式,如CSV

+0

感謝您的信息。讚賞,但不是我正在尋找的解決方案。 –