Как написать файл с разделителями табуляции, когда разделитель табуляции происходит из базы данных? - PullRequest
3 голосов
/ 03 мая 2011

У меня проблема с формулировкой этого вопроса, поэтому я пытаюсь привести пример:

Следующий код работает и создает ожидаемый результат: файл с разделителями, в котором каждый столбец разделен «реальной» вкладкой.

CSV.open(@targetfile, "wb", "\t") { |csv| 
csv << ["row", "of", "CSV", " }

Следующий код не дает ожидаемого выхода.

CSV.open(@targetfile, "wb", @targetdelimiter) { |csv| 
csv << ["row", "of", "CSV", "data"] }

@targetdelimiter в этом случае происходит из базы данных и на самом деле является строкой '\t' (без кавычек), которую может настроить пользователь.

Этот код также производит вывод с разделителями, но я могу видеть '\t' вместо "реального" символа табуляции.

Что я могу сделать со вторым блоком кода, чтобы получить тот же результат, что и первый блок кода, учитывая, что @targetdelimiter='\t' из БД?

Ответы [ 2 ]

7 голосов
/ 03 мая 2011

Просто добавь это и покончи с этим.

CSV.open(@targetfile, "wb", @targetdelimiter.gsub('\t',"\t")){ |csv| 
csv << ["row", "of", "CSV", "data"] }
1 голос
/ 03 мая 2011

\t заменяется действительным символом табуляции (ASCII 0x09 или Char(9)), когда он используется в качестве разделителя в первом примере. Во втором случае он не заменяется и используется в качестве буквенной последовательности символов \ и t. Возможно, вам повезет, если вы не заставите пользователей сохранить escape-последовательность и вместо этого использовать что-то вроде TAB или NEWLINE, которое затем можно прочитать из базы данных и вместо этого преобразовать в соответствующий символ (или вы можете просто преобразовать их из литералов в надлежащие символы).

...