【问题标题】:Unzip - how do I put inflated files into an array解压缩 - 如何将膨胀的文件放入数组中
【发布时间】:2023-08-12 16:26:01
【问题描述】:

我有一个 .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}

我的想法已经用完了,所以我决定咨询你们!提前谢谢:)

【问题讨论】:

  • 小心 XY 问题。也许看看*.com/questions/114698/…
  • 请出示您的代码。
  • 我添加了代码。
  • @FranzSkuffka 我会将它们解压缩到文件夹中,然后递归地对它们进行比较。检查我的答案

标签: xml git bash diff unzip


【解决方案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 -urNx '*.bin' foo bar

【讨论】:

  • 很高兴看到它有帮助
  • 你收到我的邮件了吗?
【解决方案2】:

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

更糟糕的是,您可能还会在 Excel 文件中包含 shared string table,这意味着工作表文件本身将不包含原始字符串(“Hello, World!”),而只是对字符串表的引用(1234)。

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

【讨论】:

  • 感谢您提供的信息。赞赏,但不是我正在寻找的解决方案。
最近更新 更多