我已经配置了自定义mime类型:
ActionController::Renderers.add :csv do |csv, options|
self.content_type ||= Mime::CSV
self.response_body = csv.respond_to?(:to_csv) ? csv.to_csv : csv
end
Run Code Online (Sandbox Code Playgroud)
和我的控制器中的respond_to块:
respond_to do |format|
format.html
format.csv { render :csv => csv_code}
end
Run Code Online (Sandbox Code Playgroud)
使用Firefox和Chrome,.csv呈现给下载的文件.使用Safari,.csv呈现为视图:如何更改此值并强制下载为文件?
查看问题的屏幕截图:

我正在使用FasterCSV,我正在使用这样的foreach循环
FasterCSV.foreach("#{Rails.public_path}/uploads/transfer.csv", :encoding => 'u', :headers => :first_row) do |row|
Run Code Online (Sandbox Code Playgroud)
但问题是我的csv有前3行作为标题...任何方法使quickCSV跳过前三行而不是只有第一行?
我遇到了FasterCSV和我的rake db:种子迁移的问题.我得到错误:"rake aborted!unquoted字段不允许\ r或\n(第2行)"对以下seeds.rb数据:
require 'csv'
directory = "db/init_data/"
file_name = "gardenzing020812.csv"
path_to_file = directory + file_name
puts 'Loading Plant records'
# Pre-load all Plant records
n=0
CSV.foreach(path_to_file) do |row|
Plant.create! :name => row[1],
:plant_type => row[3],
:group => row[2],
:image_path => row[45],
:height => row[5],
:sow_inside_outside => row[8]
n=n+1
end
Run Code Online (Sandbox Code Playgroud)
我已经搜索了这个问题的解决方案,并发现对于很多人来说这是一个UTF-8编码问题.我已经尝试过要求iconv和:encoding =>'u',但这会给我错误"UTF-8中的无效字节序列".
我是新手,我无法弄清楚它是否真的是一个我需要破解的编码问题(我一直试图做不成功,如果是这样,我真的可以使用一些指导)或者更可能是我感觉,我已经做了一个简单的失误,并且做了一些错误的方式我设置了seeds.rb,可能还有我的excel - > csv文件.csv文件中没有错误或笨拙的数据.它是简单的单字符串,文本和整数.请帮忙!
我想导入大量的cvs数据(不是直接导入AR,但经过一些提取后),而且我的代码非常慢.
def csv_import
require 'csv'
file = File.open("/#{Rails.public_path}/uploads/shate.csv")
csv = CSV.open(file, "r:ISO-8859-15:UTF-8", {:col_sep => ";", :row_sep => :auto, :headers => :first_row})
csv.each do |row|
#ename,esupp= row[1].split(/_/)
#(ename,esupp,foo) = row[1]..split('_')
abrakadabra = row[0].to_s()
(ename,esupp) = abrakadabra.split(/_/)
eprice = row[6]
eqnt = row[1]
# logger.info("1) ")
# logger.info(ename)
# logger.info("---")
# logger.info(esupp)
#----
#ename = row[4]
#eprice = row[7]
#eqnt = row[10]
#esupp = row[12]
if ename.present? && ename.size>3
search_condition = "*" + ename.upcase + "*"
if esupp.present?
#supplier = @suppliers.find{|item| item['SUP_BRAND'] …Run Code Online (Sandbox Code Playgroud) 我正在导入一个CSV文件,其中包含需要转换的字段,如下所示:
默认的CSV转换器与Date和DateTime字段不匹配。下面的这种方法似乎可行,但是想知道是否有更好的方法,可能是通过覆盖转换器使用的匹配模式?
require 'csv'
require 'date'
src = <<csv
active,date_created,date_modified
"True","03/12/2012","03/12/2012 2:14:23 PM"
"False","01/25/2011","03/12/2013 3:14:27 AM"
csv
CSV::Converters[:my_converters] = lambda{|field|
begin
case field.to_s
when "True"
true
when "False"
false
when /^\d{2}\/\d{2}\/\d{4}$/
Date.strptime(field,"%m/%d/%Y")
else
DateTime.strptime(field,"%m/%d/%Y %I:%M:%S %p")
end
rescue ArgumentError
field
end
}
csv = CSV(src, :headers => true, :converters => [:my_converters])
csv.each{|row| puts row}
Run Code Online (Sandbox Code Playgroud)
真实,2012-03-12,2012-03-12T14:14:23 + 00:00
假,2011-01-25,2013-03-12T03:14:27 + 00:00
我有一个CSV数据文件,其行可能有500多列,有些列少了很多.我需要转置它,以便每一行成为输出文件中的一列.问题是原始文件中的行可能并非都具有相同的列数,所以当我尝试数组的转置方法时,我得到:
`transpose':元素大小不同(12应该是5)(IndexError)
是否有替代的转置适用于不均匀的阵列长度?
我想添加将数据读取/写入CSV文件到我的某个模型的功能.在1.9之前的ruby版本中,这可以用更快的CS来完成,但现在这是ruby的一部分.我有以下设置:
#in my_model.rb
require 'CSV'
class MyModel < ActiveRecord::Base
... stuff ...
def self.dump_to_csv(file=File.join(Rails.root, 'tmp', 'dump', 'my_model.csv'))
CSV.open(file, "w") do |csv|
keys = new.attributes.keys
csv << keys
all.each do |m|
csv << m.attributes.values_at(*keys)
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
这工作正常,但是当我来运行测试时,我会收到大量警告
/Users/x/.rvm/rubies/ruby-1.9.2-rc2/lib/ruby/1.9.1/csv.rb:201: warning: already initialized constant VERSION
/Users/x/.rvm/rubies/ruby-1.9.2-rc2/lib/ruby/1.9.1/csv.rb:863: warning: already initialized constant FieldInfo
/Users/x/.rvm/rubies/ruby-1.9.2-rc2/lib/ruby/1.9.1/csv.rb:866: warning: already initialized constant DateMatcher
...
Run Code Online (Sandbox Code Playgroud)
我该如何删除这些警告?
类似于这个问题,除了我不在html_safe整个项目的任何地方使用.
我生成一个CSV文件,index.csv.erb如下所示:
<%=
response.content_type = 'application/octet-stream'
CSV.generate do |csv|
@persons.each do |person|
csv << [ person[:name], person[:nickname] ]
end
end
%>
Run Code Online (Sandbox Code Playgroud)
问题:如果数据库中的昵称为NULL(ActiveRecord/MySQL),则CSV文件关联元素变为"".我希望"",甚至一无所获.
结果文件示例:
Nicolas, Nico
Joe, ""
Run Code Online (Sandbox Code Playgroud)
我怎样才能防止这种情况发生?
传入的数据文件包含格式错误的CSV数据(如非转义引号)以及(有效)CSV数据(如包含新行的字段).如果检测到CSV格式错误,我想对该数据使用替代例程.
使用以下示例代码(简称为简称)
FasterCSV.open( file ){|csv|
row = true
while row
begin
row = csv.shift
break unless row
# Do things with the good rows here...
rescue FasterCSV::MalformedCSVError => e
# Do things with the bad rows here...
next
end
end
}
Run Code Online (Sandbox Code Playgroud)
MalformedCSVError是在csv.shift方法中引起的.如何从rescue子句中访问导致错误的数据?
我正在尝试以CSV格式文档导出报告.为此,我使用了更快的CSV,但我面对
Please switch to Ruby 1.9's standard CSV library.
It's FasterCSV plus support for Ruby 1.9's m17n encoding engine.
Run Code Online (Sandbox Code Playgroud)
错误.任何人都可以帮我解决这个错误吗?我的代码如下
csv_string = FasterCSV.generate do |csv|
csv << ["Client_name", "Created_at", "User type"]
@client_reports.each do |client_reports|
csv << [client_reports.email, client_reports.created_at,client_reports.role_name]
end
end
send_data csv_string,
:type => 'text/csv; charset=iso-8859-1; header=present',
:disposition => "attachment; filename=product_stock.csv"
Run Code Online (Sandbox Code Playgroud)
所以请帮我在Ruby 1.9.3中解决这个问题.它在Ruby 1.8.7中运行良好.
或者,如果您可以向我推荐任何其他资源,请帮我解决这个问题?
fastercsv ×10
ruby ×6
csv ×4
arrays ×1
html-safe ×1
migration ×1
mime-types ×1
optimization ×1
ruby-1.9.2 ×1
rubygems ×1
safari ×1
transpose ×1