代码之家  ›  专栏  ›  技术社区  ›  Jan Wirth Zayev Andrey

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

  •  1
  • Jan Wirth Zayev Andrey  · 技术社区  · 7 年前

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

    我的方法是 unzip 这整件事。生成的字符串不包含换行符,因此我对其进行了遍历 xmllint --format

    1. 解压 xml存档中有多个文件。这会导致无效的xml。即使有 unzip -q 选项我得到多个DTD等等。xmllint在此中断,而不格式化输入。

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

    2. read 为了将每个单独的xml文件提供给xmllint。由于 阅读 大多数数组项似乎为空,第三和第四项包含20个左右的xml字符串字母。

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

    3. sed 但是文件大小太大,以至于处理时间太长,无法使其能够进行扩散。

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

    2 回复  |  直到 7 年前
        1
  •  1
  •   hek2mgl    7 年前

    我会将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
    
        2
  •  1
  •   user3151902    7 年前

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

    更糟糕的是,你可能还有一个 shared string table 在Excel文件中,这意味着图纸文件本身将不包含原始字符串(“你好,世界!”),而只是对字符串表(1234)的引用。

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