Я генерирую некоторый вывод CSV, используя встроенный в Ruby CSV. Все работает нормально, но клиент хочет, чтобы в поле имени в выводе были заключены двойные кавычки, чтобы вывод был похож на входной файл. Например, вход выглядит примерно так:
1,1.1.1.1,"Firstname Lastname",more,fields
2,2.2.2.2,"Firstname Lastname, Jr.",more,fields
Вывод CSV, который является правильным, выглядит следующим образом:
1,1.1.1.1,Firstname Lastname,more,fields
2,2.2.2.2,"Firstname Lastname, Jr.",more,fields
Я знаю, что CSV делает правильные вещи, не заключая в двойные кавычки третье поле только потому, что в нем есть встроенные пробелы, и оборачивая поле двойными кавычками, когда в нем есть запятая. Чтобы помочь клиенту почувствовать тепло и нечеткость, я бы хотел, чтобы CSV всегда заключал в кавычки третье поле.
Я попытался обернуть поле в двойные кавычки в моем методе to_a
, который создает поле "Firstname Lastname"
, передаваемое в CSV, но CSV посмеялся над моей попыткой маленького человека и вывел """Firstname Lastname"""
. Это правильная вещь, потому что она избегает двойных кавычек, так что это не сработало.
Затем я попытался установить CSV :force_quotes => true
в методе open
, который выводит двойные кавычки, оборачивая все поля, как и ожидалось, но клиенту это не понравилось, что я и ожидал. Так что это тоже не сработало.
Я просмотрел документы таблиц и строк, и ничего не дало мне доступа к методу «генерировать поле строки» или способу установить флаг «для поля n всегда использовать квотирование».
Я собираюсь погрузиться в источник, чтобы увидеть, есть ли какие-то сверхсекретные твики, или есть ли способ обезопасить CSV и согнуть его, чтобы выполнить мою волю, но подумал, есть ли у кого-то какие-то специальные знания столкнуться с этим раньше.
И, да, я знаю, что могу прокрутить свой собственный выход CSV, но я предпочитаю не изобретать хорошо проверенные колеса. И я также знаю о FasterCSV; Теперь это часть Ruby 1.9.2, который я использую, поэтому явное использование FasterCSV не дает мне ничего особенного. Кроме того, я не использую Rails и не собираюсь переписывать его в Rails, поэтому, если у вас нет симпатичного способа реализовать его с помощью небольшого подмножества Rails, не беспокойтесь. Я опущу все рекомендации по использованию любого из этих способов только потому, что вы не удосужились прочитать это далеко.