解压缩 - 如何将膨胀的文件放入数组中

时间:2017-08-14 07:03:53

标签: xml git bash diff unzip

我有一个.xls文件,我想要打印得很漂亮,而不仅仅是改变了二进制文件。

我的方法是unzip这整件事。生成的字符串不包含换行符,因此我通过xmllint --format运行它。但是在这条看似简单的道路上,我遇到了几个问题,我已经花了好几个小时了:

  1. unzip xml存档中的多个文件。这会导致xml无效。即使使用unzip -q选项,我也会获得多个DTD,依此类推。 xmllint在没有格式化输入的情况下打破了这个。

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

  2. 我尝试使用read将XML拆分为数组,以便将每个xml文件都提供给xmllint。在read的结果中,大多数数组项似乎都是空的,第三项和第四项包含xml字符串的20个字母。

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

  3. 我还尝试使用sed插入换行符,但文件大小太大,以至于处理时间太长,无法进行差异化。

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

  4. 我刚刚用完了想法所以我决定咨询你们!提前谢谢:)

2 个答案:

答案 0 :(得分:1)

正如您已经发现的那样,XLSX文件包含多个XML文件,如official documentation中所述。特别是,每个Excel工作表将有一个XML文档,这意味着只是将它们组合起来将不是一个实用的解决方案。

更糟糕的是,Excel文件中也可能有shared string table,这意味着工作表文件本身不会包含原始字符串(&#34; Hello,World!&#34;)但是而只是对字符串表(1234)的引用。

根据您的使用情况,您可能需要考虑更多基于文本的格式,例如CSV

答案 1 :(得分:1)

我会将xslx解压缩到多个文件中,然后打印它们然后在xml文件上执行递归diff。 (还有二进制文件无法区分)

像这样:

# 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中排除:

diff -urNx '*.bin' foo bar