使用LibreOffice的'scalc'将制表符分隔的文本从命令行转换为Excel 参考文献来源

问题描述

我有一个以LF终止,制表符分隔的输入文件,希望使用.xlsx转换为Excel格式(例如,OOXML scalc --headless)。

我知道诸如pyuno之类的其他选项,甚至还有this one之类的一些预先编写的脚本,但我认为没有理由为了完成我认为确定的事情而与Python混淆scalc可以使用内置的命令行选项。

这是我尝试过的无效的方法

scalc --headless --convert-to xlsx input.tsv
scalc --headless --infilter=tsv --convert-to xlsx input.tsv
scalc --headless --infilter=tsv:Text --convert-to xlsx input.tsv
scalc --headless --infilter=Text:tsv --convert-to xlsx input.tsv  # --> Error: no export filter

最后两个是完整的猜测,因为,--infilter选项除了scalc --help输出中的两个示例外,没有关于--infilter="Calc Office Open XML" --infilter="Text (encoded):UTF8,LF,Liberation Mono,en-US" 选项的真实文档。

最后一个错误,但是在所有其他情况下,制表符不被识别为字段定界符,生成的Excel电子表格仅将所有数据串联在一起。

参考文献

解决方法

尽管没有令人失望的文献记载,但我能够从几个不同的来源整理这个可行的解决方案:

scalc --headless --infilter="Text - txt - csv (StarCalc):9" \
      --convert-to xlsx input.tsv

“ 9”是水平制表符的十进制ASCII control code。我使用python -c 'print(ord("\t"))'来找到它,尽管man ascii也可以。

详细的here中,可以将许多逗号分隔的选项传递给此过滤器:

╔══════════════╤══════════╤═══════════╤═════════════╤══════════════════╤═════════════════════╗
║ option (pos) │ sep. (1) │ quote (2) │ charset (3) │ 1st line (4)     │ cell format (5)     ║
╠══════════════╪══════════╪═══════════╪═════════════╪══════════════════╪═════════════════════╣
║ defaults (?) │ 44 (,)   │ 34 (")    │ 0 (system)  │ 1                │ null ("standard")   ║
╟──────────────┼──────────┼───────────┼─────────────┼──────────────────┼─────────────────────╢
║ example      │ 9 (tab)  │ 39 (')    │ 76 (UTF-8)  │ 2 (skip 1st row) │ 1/9 (skip 1st col.) ║
╚══════════════╧══════════╧═══════════╧═════════════╧══════════════════╧═════════════════════╝

例如,

scalc --headless --infilter="Text - txt - csv (StarCalc):9,39,76,2,1/9" \
      --convert-to xlsx input.tsv

将以单引号作为文本分隔符和UTF-8编码的制表符分隔的输入文件转换为Excel .xlsx文件,而跳过第一行和第一列。

如上所述,输入记录分隔符和引号字符是ASCII序数。可以查询here字符集的代码,但是可以查询0(系统默认值),1(Windows-1252),12(ISO-8859-1) ,而76(UTF-8)对于说英语的人来说很有趣。

用逗号分隔的选项字符串中的第五个位置“单元格格式”指定特定列的格式,并由正斜杠(col/fmt/col/fmt)分隔。 here对此进行了详细说明,但简要介绍了:

1   Standard
2   Text
3   MM/DD/YY
4   DD/MM/YY
5   YY/MM/DD
6   - (unused?)
7   - ("     ")
8   - ("     ")
9   ignore field (do not import)
10  US-English
    (',' as 1000s sep,'.' as decimal,regardless of locale)

此后,过滤器选项字符串中甚至还有 more 个值,这些值与导入/导出对话框中的各种选项有关,例如“引用字段为文本”。再次参考上面相同的OpenOffice wiki article进行解释,因为我在这里已经精疲力尽了。

来源

  • Linux Journal article使用pyuno,这使我无法使用Text - txt - csv (StarCalc)作为过滤器名称
    • 我基本上通过误入LibreOffice源代码树中的this directory来确证,其中定义了所有过滤器
  • https://wiki.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Filter_Options
    • 具体来说,this section用于CSV过滤器
    • 不太有用地标记为“从OpenOffice 4.1.x开始不再有效”,但是当前足够仍可以解决我的问题
    • 这篇文章让我有了一个想法,尝试将Tab的ASCII序数作为--infilter字符串的“过滤器选项”部分的第一个字符
    • 我应该在2014年从this commit推断出我应该使用冒号作为定界符,并在--infilter的输出中添加了两个soffice --help例子