Csv 使用LibreOffice';s';scalc';从命令行将制表符分隔的文本转换为Excel的步骤

Csv 使用LibreOffice';s';scalc';从命令行将制表符分隔的文本转换为Excel的步骤,csv,command-line,export-to-excel,libreoffice,tab-delimited,Csv,Command Line,Export To Excel,Libreoffice,Tab Delimited,我有一个以LF结尾、制表符分隔的输入文件,我希望使用scalc--headless将其转换为Excel格式(例如OOXML.xlsx) 我知道还有其他的选项,比如,甚至还有一些预先编写好的脚本,比如,但是我认为没有理由为了完成一些我认为内置命令行选项可以完成的事情而使用Python 以下是我尝试过但没有成功的方法: scalc --headless --convert-to xlsx input.tsv scalc --headless --infilter=tsv --convert-to x

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

我知道还有其他的选项,比如,甚至还有一些预先编写好的脚本,比如,但是我认为没有理由为了完成一些我认为内置命令行选项可以完成的事情而使用Python

以下是我尝试过但没有成功的方法:

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
最后两个完全是猜测,因为除了scalc--help输出中的两个示例之外,
--infilter
选项没有真正的文档

最后一个生成了错误,但在所有其他情况下,制表符不被识别为字段分隔符,生成的Excel电子表格在第一列中将所有数据连接在一起

工具书类
    • 具体而言,“”部分显示了两个示例:
      --infilter="Calc Office Open XML"
      --infilter="Text (encoded):UTF8,LF,Liberation Mono,en-US"
      
      我假设它分别表示从.xlsx到Calc的转换,以及从纯文本到Writer的转换

尽管令人失望的是,我没有记录在案,但我能够从几个不同的来源拼凑出这个有效的解决方案:

scalc--headless--infilter=“Text-txt-csv(StarCalc):9”\ --转换为xlsx input.tsv “9”是水平制表符的小数点。我使用了
python-c'print(ord(“\t”)”
来找到这个,尽管
manascii
也可以工作

如前所述,有许多逗号分隔的选项可以传递到此筛选器:

╔══════════════╤══════════╤═══════════╤═════════════╤══════════════════╤═════════════════════╗
║ 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”\
--转换为xlsx input.tsv
将带单引号的制表符分隔输入文件转换为Excel.xlsx文件,并跳过第一行和第一列

如上所述,输入记录分隔符和引号字符是ASCII序号。可以查找字符集的代码,但英语使用者感兴趣的是
0
(系统默认)、
1
(Windows-1252)、
12
(ISO-8859-1)和
76
(UTF-8)

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

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)
在此之后,过滤器选项字符串中还有更多的值,这些值与导入/导出对话框中的各种选项有关,例如“引用字段为文本”。请再次参考上面的同一链接以了解这些值的解释,因为我在这里已经没有动力了

来源
  • 这是使用pyuno实现的,它使我使用
    Text-txt-csv(StarCalc)
    作为过滤器名称
    • 我在LibreOffice源代码树中进行了大量的修改,所有的过滤器都是在那里定义的,这也证实了这一点
    • 具体来说,对于CSV过滤器
    • 虽然标记为“从OpenOffice 4.1.x开始不再是最新的”,但它的最新版本仍然足以解决我的问题
    • 这篇文章让我想到尝试使用ASCII序号for tab作为
      --infilter
      字符串“filter options”部分的第一个字符
    • 我应该使用冒号作为分隔符,这是我在2014年推断出来的,它将两个
      --infiter
      示例添加到
      soffice--help
      的输出中