У меня есть несколько больших файлов CSV, и я хотел бы, чтобы они были в формате TSV (в формате табуляции). Сложность состоит в том, что в полях файла CSV есть запятые, например:
A,,C,"D,E,F","G",I,"K,L,M",Z
Ожидаемый результат:
A C D,E,F G I K,L,M Z
(где пробелы между ними - «жесткие» вкладки)
На этом сервере установлены Perl, Python и coreutils.
text-processing
python
perl
csv-simple
Темное сердце
источник
источник
Ответы:
питон
Добавить в файл с именем
csv2tab.sh
и сделать его исполняемымТестовые прогоны
источник
csv.writer(sys.stdout, dialect='excel-tab').writerows(csv.reader(sys.stdin))
? Устраняет цикл также.python -c 'import csv,sys; csv.writer(sys.stdout, dialect="excel-tab").writerows(csv.reader(sys.stdin))'
. Я сомневаюсь,-m
что так работает.Ради прикола
sed
.Если ваш
sed
не поддерживает-E
, попробуйте с-r
. Если выsed
не поддерживаете\t
буквенную вкладку, попробуйте поместить буквенную вкладку (во многих оболочках, ctrl- v tab) или в Bash, используйте$'...'
строку в стиле C (в этом случае обратная косая черта\2
должна быть удвоена). Если вы хотите сохранить цитаты, используйте\1
вместо\2
(в этом случае внутренняя пара скобок бесполезна и может быть удалена).Это не делает попытку обработать экранированные двойные кавычки внутри двойных кавычек; некоторые диалекты CSV поддерживают это, удваивая цитируемую двойную кавычку (sic).
источник
Используя
csvkit
утилиту (Python), например:Потоковая передача, с правильным цитированием и экранированием CSV и TSV
Это в apt и других пакетных менеджерах
источник
Одним из вариантов может быть модуль Perl Text :: CSV, например
показывать
источник
Perl
Awk
Результат:
источник
Решение термоядерной мухобойки должно использовать libreoffice. Хотя https://ask.libreoffice.org/en/question/19042/is-is-possible-to-convert-comma-separated-value-csv-to-tab-separated-value-tsv-via-headless-mode / предполагает, что это невозможно, но это неправильно (или просто устарело?), и моя команда работает на 5.3:
loffice "-env:UserInstallation=file:///tmp/LibO_Conversion" --convert-to csv:"Text - txt - csv (StarCalc)":9,34,UTF8 --headless --outdir some/path --infilter='csv:44,34,UTF8' *.csv
env
аргумент может быть пропущен , но таким образом документы не будут отображаться в последнем документе.источник
Если у вас есть или можете установить
csvtool
утилиту:Обратите внимание, что по какой-то причине
csvtool
нет справочной страницы, ноcsvtool --help
напечатает пару сотен строк документации.источник
Использование
mlr
почти лаконично, но отключение заголовков требует длинных опций:Выход:
источник
Я создал конвертер CSV в TSV с открытым исходным кодом, который обрабатывает описанные преобразования. Это довольно быстро, может быть стоит посмотреть, если есть необходимость конвертировать большие файлы CSV. Инструмент является частью набора утилит eBay TSV (документация по csv2tsv здесь ). Для описанного ввода достаточно параметров по умолчанию:
источник
напор
Просто для удовольствия, в Vim можно выполнять замены регулярных выражений . Вот потенциальное четырехстрочное решение, адаптированное с: /programming/33332871/remove-all-commas-between-quotes-with-a-vim-regex
Кавычки удалены.
Чтобы написать сценарий решения, четыре строки выше (без двоеточия) могут быть сохранены в файл, например
to_tsv.vim
. Откройте каждый CSV для редактирования с Vim иsource
вto_tsv.vim
скрипте на Vim командной строки (адаптировано из /programming/3374179/run-vim-script-from-vim-commandline/8806874#8806874 ):источник
Вот пример преобразования CSV в TSV с помощью
jq
утилиты :или:
Однако формат CSV должен быть хорошо отформатирован, поэтому каждая строка должна быть заключена в кавычки.
Источник: Простой выходной формат TSV .
источник
При
perl
условии, что в полях csv нет встроенных"
или новых строк или вкладок:источник
Следующее является просто исправлением ответа от @tripleee, так что он удаляет все кавычки из конечного поля так же, как и все остальные поля.
Чтобы показать, что исправляется, ниже приведен ответ тройного пользователя , а также небольшая модификация примерных данных ОП с добавлением кавычек вокруг последнего поля « Z ».
Вы можете видеть, что « Z » остается с кавычками вокруг него. Это отличается от того, как обрабатываются внутренние поля. Например, у ' G ' нет кавычек.
Следующая команда использует вторую замену для очистки последнего столбца:
источник
'A,,C,"D,E,F","G",I,"K,L,M","Z,A"'
вводятся в этот ответ, то"Z,A"
неверно заменяетсяZ A
вместо правильногоZ,A
.