Заменить или игнорировать символ новой строки при преобразовании файлов ods в файлы csv с помощью Gnumeric ssconvert

Я использую ssconvert Команда в Gnumeric, чтобы преобразовать кучу ODS файлы в кучу CSV файлы. Я использую следующую команду

ssconvert -O 'separator=; quoting-mode=never' "f.ods" "f.txt";

который отлично работает... большую часть времени. Иногда существуют ячейки, в которых пользователь вводит символ новой строки внутри ячейки (в OpenOffice и LibreOffice на Mac это можно сделать, нажав cmd+enter). Это приводит к впоследствии созданному CSV файл получает дополнительную строку, поэтому вместо

This is some text. Here comes a newline that should be ignored;Some data;Some more data

я получил

This is some text. Here comes a newline that should be ignored;Some data; Some more data

Можно ли в процессе преобразования заменить все эти символы новой строки в ячейках чем-то другим, например *? Или я могу как-то настроить компьютер на игнорирование всех встроенных символов в ячейках?

2 ответа

Решение

Вот ваша проблема:

ssconvert -O 'separator=;quoting-mode=never'"f.ods" "f.txt";

Предотвращая цитирование ssconvert в случае необходимости, вы стреляете себе в ногу здесь, и ваша проблема не ограничивается переводом строки. Например, эта таблица:

example.ods

преобразуется вашей командой ssconvert в это:

example.txt

A1;B1;C1
A2;XX;B2
YY;C2

Удачи в этом.

Вместо того, чтобы пытаться отменить беспорядок после преобразования (что будет невозможно сделать надежно), или каким-то образом предварительно обработать исходный файл ODS перед преобразованием (что безумие - если вы преобразовываете в CSV, это, вероятно, потому что вы Вы хотите использовать диалект CSV, у которого нет такого фундаментального недостатка.

Это означает, что вам нужны ваши данные для цитирования. Оказывается, что ssconvert недостаточно интеллектуален, чтобы заключать в кавычки ячейки, содержащие разделитель, по умолчанию:

$ ssconvert -O 'separator=;' example.ods example-2.txt
$ cat example-2.txt
A1;B1;C1
A2;XX;"B2
YY";C2

... так что вам нужно будет процитировать все:

$ ssconvert -O 'separator=; quoting-mode=always' example.ods example-3.txt
$ cat example-3.txt 
"A1";"B1";"C1"
"A2;XX";"B2
YY";"C2"

Там нет надежного способа обойти это с CSV; любое решение, которое вы придумали, кроме правильного цитирования ваших данных, в какой-то момент вернется и укусит вас, потому что CSV без кавычек в корне нарушает формат данных.

Повторим: не пытайтесь обойти этот фундаментальный недостаток в не цитируемом CSV. Даже если вы думаете, что обошли все проблемы, которые создали для себя, используя неоднозначный формат данных, в какой-то момент возникнет непредвиденное обстоятельство, и вы раскаетесь на досуге.

Другое решение (в данном случае для файлов xlsx):

  1. (если еще не установлен) установитьxlsx2csv: установить apt или pip

  2. с опцией-e, внутри многострочных ячеек новая строка заменяется на\n

Повторное использование примера @ZeroPiraeus,

      $ xlsx2csv -e -d ';' example.xlsx

A1;B1;C1
A2;XX;B2\nYY;C2
Другие вопросы по тегам