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



我有一个.xls文件,我想打印出来,以便有很好的差异,而不仅仅是二进制文件被更改。

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

  1. 在 xml 存档中unzip多个文件。这会导致无效的 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}

我刚刚没有想法,所以我决定咨询你们!提前谢谢:)

我会将 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

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

更糟糕的是,您可能还在Excel文件中有一个共享字符串表,这意味着工作表文件本身将不包含原始字符串("Hello,World!"(,而只是对字符串表的引用(1234(。

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

最新更新