Экранирование запятой из CSV в Ruby

#ruby-on-rails #csv #html-parsing #comma

#ruby-on-rails #csv

Вопрос:

Я создаю загрузку CSV в своем приложении Ruby, в котором есть несколько полей суммы в долларах. Эти поля содержат данные в формате cyrrency, например, $ 35 456, и когда такие данные поступают в CSV, они разделяются на два файла, данные после запятой перемещаются в следующий столбец в CSV.

Вот мой код для отображения CSV

 Sell Date, Sell Amount
- @rows.each do |row|
  = "#{row[0]},#{number_to_currency(row[1], :precision => 2)}"
  

Вот действие, используемое для возврата CSV

 def fifolog
  @rows = Report.fifolog()
respond_to do |format|
  format.csv { render csv: {:rows =>@rows }}
end
end
  

Есть ли какой-либо escape-символ, который я могу использовать для экранирования «,» в ruby

Спасибо

Ответ №1:

Используйте встроенный to_csv метод Ruby.

Если вы еще этого не сделали, вам нужно require 'csv' это сделать .

 Sell Date, Sell Amount
- @rows.each do |row|
  = [ row[0], number_to_currency(row[1], :precision => 2) ].to_csv( row_sep: nil ).html_safe
  

to_csv доступно прямо на Array и выполняет все экранирования, которые вы ожидаете от него.

row_sep: nil предотвращает n в конце каждой строки, так как вы уже это делаете each . Попробуйте без этого, и вы увидите, что получите дополнительную пустую строку. Если бы вы просто создавали одну строку CSV, вам нужно было бы сохранить n для разделения строк.

html_safe предотвращает amp;quot; отображение символов в вашем CSV-файле.

Это должно сработать!

JP

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

1. Стоит отметить, что вам нужно require 'csv' сделать это до того, как эти методы станут доступны.

Ответ №2:

Используйте двойные кавычки вокруг значений, содержащих запятую:

 "$35,456"
  

Редактировать:
Используя FasterCSV, измените следующие строки:

 respond_to do |format|
  format.csv { render csv: {:rows =>@rows }}
  

Для

 csv_data = FasterCSV.generate do |csv| 
    csv << ["Sell Date", "Sell Amount"] 

    @rows.each do |row| 
      csv << [row[0],number_to_currency(row[1], :precision => 2)] 
    end 
  end 

  send_data csv_data, 
            :type => 'text/csv', 
            :disposition => "attachment; filename=file.csv"
  

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

1. я пытался и это удалить amp;quote; в Excel, но это может быть неправильный синтаксис, я использовал this = «»#{строка[0]}»,»#{ number_to_currency(строка[1], :точность => 2)} «..

2. Это правильный синтаксис. Я попробовал, и он правильно отображается в Open Office. Попробуйте открыть необработанный CSV-файл в Notepad или vi и посмотреть, действительно ли он содержит двойные кавычки.

3. Если CSV поступает из приложения Rails, вам нужно будет установить тип содержимого: send_data csv_data, :type => "text/plain", :filename=>"file.csv", :disposition => 'attachment'

4. я открываю его в блокноте и текстовой панели, и у него есть «, я использую Ubuntu и при открытии MS Excel дает тот же результат

5. Другим вариантом для обработки CSV и экранирования является FasterCSV ( fastercsv.rubyforge.org )