问题描述
我有一个以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电子表格仅将所有数据串联在一起。
参考文献
- https://help.libreoffice.org/latest/en-US/text/shared/guide/start_parameters.html
- 特别是“ General arguments”部分,其中显示了两个示例:
{{1}}
我假设分别指示从.xlsx到Calc的转换,以及从纯文本到Writer的转换
- 特别是“ General arguments”部分,其中显示了两个示例:
解决方法
尽管没有令人失望的文献记载,但我能够从几个不同的来源整理这个可行的解决方案:
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
例子