解压缩 - 如何将膨胀的文件放入数组中
Unzip - how do I put inflated files into an array
我有一个 .xls 文件,我想将其打印出来以便进行比较,而不是仅仅更改二进制文件。
我的方法是 unzip
这整件事。生成的字符串不包含换行符,所以我 运行 通过 xmllint --format
。但是在这条看似简单的道路上,我遇到了几个我已经花了几个小时解决的问题:
unzip
xml 存档中的多个文件。这导致无效 xml。即使使用 unzip -q
选项,我也会得到多个 DTD 等等。 xmllint 在没有格式化输入的情况下中断。
unzip -c -a -q myFile.xlsx | xmllint --format -
我尝试使用 read
将 XML 拆分为一个数组,以便将每个单独的 xml 文件提供给 xmllint。在 read
的结果中,大多数数组项似乎是空的,第三项和第四项包含 xml 字符串的 20 多个字母。
IFS='\<\?xml' read -r -a files <<< "$decompressed"
我也试过用 sed
插入换行符,但文件太大,处理时间太长,无法进行差异化处理。
${decompressed/\>\</\>\n\</g}
我刚刚运行没有想法所以我决定请教你们!提前致谢:)
您已经发现,XLSX 文件包含多个 XML 文件,如 official documentation 中所指定。特别是,每个 Excel sheet 将有一个 XML 文档,这意味着将它们组合起来并不是一个实际的解决方案。
更糟糕的是,Excel 文件中可能还有 shared string table,这意味着 sheet 文件本身将不包含原始字符串("Hello, World!" ), 而只是对字符串 table (1234).
的引用
根据您的用例,您可能需要考虑更多基于文本的格式,例如 CSV。
我会将 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 -urNx '*.bin' foo bar
我有一个 .xls 文件,我想将其打印出来以便进行比较,而不是仅仅更改二进制文件。
我的方法是 unzip
这整件事。生成的字符串不包含换行符,所以我 运行 通过 xmllint --format
。但是在这条看似简单的道路上,我遇到了几个我已经花了几个小时解决的问题:
unzip
xml 存档中的多个文件。这导致无效 xml。即使使用unzip -q
选项,我也会得到多个 DTD 等等。 xmllint 在没有格式化输入的情况下中断。unzip -c -a -q myFile.xlsx | xmllint --format -
我尝试使用
read
将 XML 拆分为一个数组,以便将每个单独的 xml 文件提供给 xmllint。在read
的结果中,大多数数组项似乎是空的,第三项和第四项包含 xml 字符串的 20 多个字母。IFS='\<\?xml' read -r -a files <<< "$decompressed"
我也试过用
sed
插入换行符,但文件太大,处理时间太长,无法进行差异化处理。${decompressed/\>\</\>\n\</g}
我刚刚运行没有想法所以我决定请教你们!提前致谢:)
您已经发现,XLSX 文件包含多个 XML 文件,如 official documentation 中所指定。特别是,每个 Excel sheet 将有一个 XML 文档,这意味着将它们组合起来并不是一个实际的解决方案。
更糟糕的是,Excel 文件中可能还有 shared string table,这意味着 sheet 文件本身将不包含原始字符串("Hello, World!" ), 而只是对字符串 table (1234).
的引用根据您的用例,您可能需要考虑更多基于文本的格式,例如 CSV。
我会将 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 -urNx '*.bin' foo bar