Использование scalc в LibreOffice для преобразования текста, разделенного табуляцией, в Excel из командной строки

#command-line #export-to-excel #libreoffice #csv

#командная строка #экспорт в Excel #libreoffice #csv

Вопрос:

У меня есть входной файл с разделителями табуляции, который я хочу преобразовать в формат Excel ( .xlsx например, OOXML), используя scalc --headless .

Я знаю о других вариантах, таких как pyuno, и даже о некоторых готовых сценариях, подобных этому, но я не вижу причин связываться с 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 данных .

Последнее привело к ошибке, но во всех остальных случаях символ табуляции не распознается как разделитель полей, в результирующей таблице Excel все данные объединены вместе в первом столбце.

Список литературы

Комментарии:

1. В настоящее время я даже не беспокоюсь об этом с помощью LibreOffice из-за отсутствия краткой, легкодоступной документации ( например , справочных страниц или ) для параметров конвертера. Вместо этого я использую свою собственную очень тонкую оболочку Python для библиотек openpyxl и tabulate, что далеко не быстро, но достаточно хорошо для большинства одноразовых преобразований Excel с разделителями табуляции , мой типичный вариант использования.

Ответ №1:

Хотя, к сожалению, без документов, я смог собрать это рабочее решение из нескольких разных источников:

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

«9» — это десятичный код управления ASCII для горизонтальной вкладки. Раньше я python -c 'print(ord("t"))' находил это, хотя man ascii это тоже сработало бы.

Как подробно описано здесь, существует ряд параметров, разделенных запятыми, которые можно передать этому фильтру:

 ╔══════════════╤══════════╤═══════════╤═════════════╤══════════════════╤═════════════════════╗
║ 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. Коды для набора символов можно посмотреть здесь, но 0 (по умолчанию система), 1 (Windows-1252), 12 (ISO-8859-1) и 76 (UTF-8) интересны для англоговорящих.

5-е место в строке параметров, разделенных запятыми, «формат ячейки», задает формат для определенных столбцов и разделяется косой чертой ( 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)
  

После этого в строке параметров фильтра есть еще больше значений, которые относятся к различным параметрам в диалоговом окне импорта / экспорта, таким как «Поле в кавычках как текст». Обратитесь снова к той же статье OpenOffice wiki, на которую ссылались выше, для объяснения этого, потому что я выдыхаюсь здесь.

Источники

  • в этой статье Linux Journal используется pyuno, которая подсказала мне использование в Text - txt - csv (StarCalc) качестве имени фильтра
    • что я подтвердил, в основном наткнувшись на этот каталог в дереве исходных текстов LibreOffice, где определены все фильтры
  • https://wiki.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Filter_Options
    • в частности, этот раздел для фильтра CSV
    • не очень полезно помечено как «больше не актуально с OpenOffice 4.1.x», но достаточно актуально, чтобы решить мою проблему
    • эта статья натолкнула меня на идею попробовать порядковый номер ASCII для tab в качестве первого символа части строки «параметры фильтра» --infilter
    • то, что я должен использовать двоеточие в качестве разделителя, я вывел из этого коммита в 2014 году, который добавил два --infilter примера к выводу soffice --help