плагин для текстового редактора или утилита импорта, которая может работать как с разделителями табуляции, так и с CSV

В FAQ написано, что это ПО теме:

   SOFTWARE TOOLS COMMONLY USED BY PROGRAMMERS

поэтому я ожидаю, что он не будет закрыт! В прошлый раз, когда я спрашивал, это было закрыто как не по теме.

РЕДАКТИРОВАТЬ: предлагаемые ответы, связанные с Excel, не будут работать, потому что Excel искажает файл с разделителями табуляции на пути IN. Я не программирую на Python, и говорят, что утилита Python не работает со строками со встроенными кавычками и запятыми. Мне нужно что-то, что понимает RFC 4180.

Мне нужна утилита или подключаемый модуль текстового редактора, который может экспортировать в стандартный формат в кавычках с разделителями-запятыми. Я не хочу писать его сам, так как мне нужно написать другой более насущный код.

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

В последних версиях Excel строки не заключаются в двойные кавычки; старые версии делали.

Если вы знаете о ПРОГРАММНОМ ИНСТРУМЕНТЕ, ИСПОЛЬЗУЕМОМ ПРОГРАММАМИ, который выполняет эту задачу с апломбом, пожалуйста, сообщите.


person Tim    schedule 09.03.2013    source источник
comment
Какой формат вы пытаетесь экспортировать в CSV?   -  person Dagg Nabbit    schedule 10.03.2013
comment
Наиболее часто используется табуляция. Устаревшая процедура импорта ожидает формат CSV с двойными кавычками. Таким образом, утилите придется либо угадывать типы данных, либо позволить разработчику указывать тип столбца за столбцом.   -  person Tim    schedule 10.03.2013
comment
возможный дубликат Is есть инструмент для добавления двойных кавычек вокруг ВСЕХ элементов CSV?   -  person Dagg Nabbit    schedule 10.03.2013
comment
@GGG: посмотри мое редактирование. При ИМПОРТИРОВАНИИ файла с разделителями табуляции в Excel, Excel искажает файл (например, в почтовых индексах с начальными нулями ноль удален). Раньше Excel был очень хорош в этом. Уже нет. У меня просто слишком много этих файлов, чтобы исправлять такие ошибки импорта, поэтому мне нужна интеллектуальная утилита, которая либо будет цитировать каждое поле, либо позволит мне указать, какие поля цитировать в соответствии с RFC 4180. Иногда эти файлы имеют более 100 столбцов.   -  person Tim    schedule 10.03.2013
comment
Можете ли вы предоставить небольшой образец данных TSV, которые вы пытаетесь импортировать? Я думаю, нам нужно посмотреть, как он цитируется и есть ли в нем встроенные табуляции, запятые или символы кавычек. Это должно быть так же просто, как поиск и замена на выбранном вами языке сценариев (если python отсутствует, подойдет ли perl?), но найти инструмент, который может справиться с этим, будет просто удачей (а вы попробуй гугл документы?)   -  person Dagg Nabbit    schedule 10.03.2013
comment
Вот небольшой вымышленный образец: John|McDougal|"Mac"|123 Main St|Princeton|NJ|08543||100.88|20130309|biking, hiking и вместо вертикальной черты-разделителя был бы TAB. В примере есть псевдоним Mac, уже заключенный в кавычки, список с разделителями-запятыми, почтовый индекс с начальным нулем и пустое поле.   -  person Tim    schedule 10.03.2013
comment
Понял... и желаемый результат для этой строки? Я знаю, что вы коснулись этого в своем вопросе, просто хочу быть абсолютно ясным :)   -  person Dagg Nabbit    schedule 10.03.2013
comment
"John","McDougal",""Mac"","123 Main St","Princeton","NJ","08540","100.88","","20130309","biking, hiking" — основной формат; иногда целые и десятичные числа не заключаются в кавычки, но это нормально, если все в кавычках.   -  person Tim    schedule 10.03.2013
comment
В соответствии с rfc4180 (стр. 6, пункт 6) третий столбец в вашем TSV должен выглядеть как """Mac""". Если это не так, я бы предположил, что в TSV ничего не цитируется, а встроенные вкладки экранированы, например \t или что-то подобное?   -  person Dagg Nabbit    schedule 10.03.2013
comment
" — это одиночный символ (U+0022), а не две одинарные кавычки подряд, ''. Когда в данных появляется ", он экранируется другим ", например. ""Mac"". Не """Mac""".   -  person Tim    schedule 10.03.2013
comment
Пробелы и табуляции считаются частью данных и должны появляться внутри U+0022 (foo TAB foo), где TAB — символ табуляции.   -  person Tim    schedule 11.03.2013
comment
Тим, да, но внешние кавычки заключают поле. Итак, """Mac""" ~ "Mike ""Mac"" McDonald". Согласно rfc4180 (который, по общему признанию, не является TSV), если поле содержит кавычки, оно должно быть заключено в кавычки. Mac должен стать Mac afaik. Во всяком случае, sed, кажется, хорошо с этим справляется, сделает из этого ответ.   -  person Dagg Nabbit    schedule 11.03.2013
comment
Хорошо, я вижу, вы убегали и окружали.   -  person Tim    schedule 11.03.2013


Ответы (1)


Для этого можно использовать инструмент sed. Учитывая ваш пример, предполагая, что каналы являются вкладками:

Джон|Макдугал|"Мак"|123 Мейн-стрит|Принстон|Нью-Джерси|08543||100.88|20130309|езда на велосипеде, походы

И желаемый результат: *

"Джон", "Макдугал", """Мак"", "123 Main St", "Принстон", "Нью-Джерси", "08540", "100,88", "", "20130309", "езда на велосипеде, походы"

Это можно сделать:

  • Замена " на ""
  • Замена табуляции запятыми в кавычках
  • Каждая строка заключена в кавычки
  • Обрезка завершающих пустых строк

С sed это просто вопрос:

sed 's/"/""/g; s/\t/","/g; s/^\|$/"/g; /^"$/d' < in.tsv > out.csv

Проект GnuWin поддерживает порт sed для Windows здесь.

* Я думаю, вам нужно """Mac""", а не ""Mac"", как обсуждалось выше.

person Dagg Nabbit    schedule 10.03.2013
comment
Я не знаком с sed, но изучу его. Спасибо. Будет ли приведенный выше код проходить через файл построчно? - person Tim; 11.03.2013
comment
@Tim да, вот простое объяснение . Sed выполняет каждую операцию (3 замены и одно удаление) в каждой строке из стандартного ввода и отправляет результат в стандартный вывод по одной строке за раз. (изменить - вот лучшее объяснение.) - person Dagg Nabbit; 12.03.2013
comment
Я надеялся найти утилиту, которая может легко переключаться между различными форматами обмена данными (нашел коммерческий), но примет этот ответ как действительный ответ на мой вопрос. Спасибо. - person Tim; 14.03.2013