Заменить или игнорировать символ новой строки при преобразовании файлов 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):
(если еще не установлен) установить
xlsx2csv
: установить apt или pipс опцией
-e
, внутри многострочных ячеек новая строка заменяется на\n
Повторное использование примера @ZeroPiraeus,
$ xlsx2csv -e -d ';' example.xlsx
A1;B1;C1
A2;XX;B2\nYY;C2