rails 3.1 генерация CSV-файла

#ruby-on-rails #ruby-on-rails-3 #csv #ruby-on-rails-3.1

#ruby-on-rails #ruby-on-rails-3 #csv #ruby-on-rails-3.1

Вопрос:

Я могу экспортировать данные таблицы в файл CSV, однако после каждой записи остается пустая строка. Почему и как мне это исправить?

в index.html.erb

 <%= link_to "Export to csv", request.parameters.merge({:format => :csv})%>
  

в index.csv.erb

 <%- headers = ["Id", "Name"] -%>
<%= CSV.generate_line headers %>
<%- @customers.each do |n| -%>
<%- row = [ n.id, n.fname ] -%>
<%= CSV.generate_line row %>
<%- end -%>
  

Комментарии:

1. Я попробовал ваш код, и, похоже, он работает. Нет пустой строки после каждой записи. Возможно, вам нужно проверить n.fname, у вас может быть символ новой строки в содержимом поля.

2. @MatteoAlessani, похоже, отсутствует в записях базы данных. Где-нибудь еще я могу посмотреть? Могу ли я просто удалить новые строки из строки перед созданием строки?

3. да, вы можете попытаться удалить их или поле.

4. @MatteoAlessani я это исправил. Эта строка сделала свое дело. Я думаю, что это как-то связано с переключением ruby на fastercsv в ruby 1.9. эта строка вводит значения, разделенные табуляцией. <%= Строка CSV.generate_line, :row_sep => ?t, :quote_char => ? %>

Ответ №1:

CSV.generate_line добавляет символ новой строки в конец строки, которую он генерирует, но делает <%= %> так, чтобы вы получали две новые строки.

Чтобы исключить символ новой строки из вывода erb выражения, используйте этот синтаксис: <%= -%>

итак:

 <%- headers = ["Id", "Name"] -%>
<%= CSV.generate_line headers -%>
<%- @customers.each do |n| -%>
<%- row = [ n.id, n.fname ] -%>
<%= CSV.generate_line row -%>
<%- end -%>
  

Принятый ответ остается в новой строке, сгенерированной из erb , но подавляет новую строку, из CSV.generate_line которой, я думаю, это не лучший способ сделать это.

Комментарии:

1. Это идеальный ответ. Изначально я решил эту проблему с помощью .html_safe.strip . Это работало до тех пор, пока у меня не появилась строка в двойных кавычках с запятой. Это испортило все мои столбцы и было в недоумении относительно решения, пока не наткнулось на этот ответ. Мое единственное предложение заключается в том, что вам не нужно — в каждой строке, оно должно быть только в той же строке, в которой есть = . Большое вам спасибо!

2. это действительно должно быть принятым ответом. намного чище

Ответ №2:

Это то, что исправило это.

 <%= CSV.generate_line row, :row_sep => ?t, :quote_char => ? %>
  

Комментарии:

1. Я хотел бы узнать больше об этой кодировке. Почему знак вопроса?

2. Из tutorialspoint.com/ruby/ruby_variables.htm — Вы можете получить целочисленное значение, соответствующее символу ASCII или escape-последовательности, поставив перед ним вопросительный знак.

3. По какой-то причине этот метод добавляет дополнительный ‘0’ в конце каждой строки. Есть идеи, почему это может происходить?

Ответ №3:

для меня после использования strip и html_safe сработало, применено после создания строки:

 <%- headers = ["Id", "Tour No"] -%>
<%= CSV.generate_line(headers).strip%>
<%- @tours.each do |t| -%>
<%-   row = [ t.id,t.tour_no] -%>
<%= CSV.generate_line(row).html_safe.strip%>
<%- end -%>
  

Ответ №4:

Попробуйте это:

 row = [ n.id, n.fname.strip ]
  

strip удалит r и / или n, что может привести к появлению пустых строк. У меня нет другого объяснения, что ваш исходный код в порядке!

Ответ №5:

Я думал, что подключусь к своему решению, так как просто боролся с этим.

В принципе, на моем локальном компьютере (mac) все работало абсолютно нормально, затем, когда я развернул свое приложение на heroku, оно начало добавлять в эти загадочные новые строки.

Для меня решением было использовать:

 CSV.generate_line(row, row_step: ?r).html_safe
  

В качестве примечания я использую rails 4.1.6.

Надеюсь, это поможет некоторым другим людям, которые борются