#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 )