当我在我的应用程序上尝试FasterCSV gem时,我收到此错误:
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)
顺便说一下,我使用的是Rails 3,Ruby 1.9.2和Rubygems 1.4.
有人可以向我解释如何使用Ruby 1.9的标准CSV库.我完全没有任何想法,因为我对Rails很新.
我有一个现有的rails应用程序我在ruby 1.9.2和linux上运行它的rails版本
rails 2.3.8
Run Code Online (Sandbox Code Playgroud)
它还有一个GEMFILE,在它的vendor/gems目录中它有'fastercsv-1.5.4'gem
并且在它的迁移中(在两次迁移中)它需要gem'quickedcsv'
require 'fastercsv'
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做
rake db:migrate
Run Code Online (Sandbox Code Playgroud)
它没有通过迁移声明
"请切换到Ruby 1.9的标准CSV库.它是FasterCSV加上对Ruby 1.9的m17n编码引擎的支持."
我发现消息来自gems'fast_csv.rb'文件.因为它有条件检查ruby版本
if RUBY_VERSION >= "1.9"
class FasterCSV
def self.const_missing(*_)
raise NotImplementedError, "Please switch to Ruby 1.9's standard CSV " +
"library. It's FasterCSV plus support for " +
"Ruby 1.9's m17n encoding engine."
end
def self.method_missing(*_)
const_missing
end
def method_missing(*_)
self.class.const_missing
end
end
-- and more code
Run Code Online (Sandbox Code Playgroud)
有人能告诉我如何解决这个问题.请注意,'fastercsv'尚未添加到GEMFILE中.
我在使用Ruby将列写入csv文件时遇到问题.下面是我的代码片段.
calc = numerator/denominator.to_f
data_out = "#{numerator}, #{denominator}, #{calc}"
File.open('cdhu3_X.csv','a+') do|hdr|
hdr << ["numerator","denominator","calculation\n"] #< column header
hdr << "#{data_out}\n"
end
Run Code Online (Sandbox Code Playgroud)
代码将列标题添加到每一行,我只需要在每列数据的顶部.我在这里和其他地方搜索过但无法找到明确的答案.任何帮助将不胜感激.
尝试解析CSV文件,但仍然收到错误消息未加引号的字段不允许\ r或\n(第2行)..
我在这里找到了类似的主题,这里有一个提示:
CSV.open('file.csv', :row_sep => "\r\n") do |csv|
Run Code Online (Sandbox Code Playgroud)
但不幸的是他没有用...我无法更改CSV文件,所以我需要在代码中修复它.
编辑 CSV文件样本:
A;B;C
1234;...
Run Code Online (Sandbox Code Playgroud)
有什么办法吗?
非常感谢!
我发现了FasterCSV(1.5.0)的CSV解析问题,这似乎是一个真正的错误,但我希望有一个解决方法.
基本上,当字段用引号括起来时,在分隔符后面添加一个空格(在我的例子中是逗号)会生成一个MalformedCSVError
.
这是一个简单的例子:
# No quotes on fields -- works fine
FasterCSV.parse_line("one,two,three")
=> ["one", "two", "three"]
# Quotes around fields with no spaces after separators -- works fine
FasterCSV.parse_line("\"one\",\"two\",\"three\"")
=> ["one", "two", "three"]
# Quotes around fields but with a space after the first separator -- fails!
FasterCSV.parse_line("\"one\", \"two\",\"three\"")
=> FasterCSV::MalformedCSVError: Illegal quoting on line 1.
Run Code Online (Sandbox Code Playgroud)
我疯了,或者这是FasterCSV中的一个错误?
我正在处理政府来源(FEC,州选民数据库等)的数据.它的格式不一致,这会以各种令人愉快的方式破坏我的CSV解析器.
它是外部采购和权威的.我必须解析它,我不能重新输入,在输入时验证等.就是这样; 我不控制输入.
属性:
Foo \xAB bar
)"foo",123,"bar"
)或不带引号(foo,123,bar
).我还没有遇到任何在给定行(即"foo",123,bar
)中混合的地方,但它可能在那里.我正在使用Ruby FasterCSV(在1.9中仅称为CSV),但这个问题应该与语言无关.
我的猜测是,解决方案需要使用明确的记录分隔符/引号字符(例如ASCII RS,STX)进行预处理替换.我已经在这里开始了一点但它并不适用于我得到的一切.
如何可靠地处理这种脏数据?
ETA:以下是单个文件中可能包含的简化示例:
"this","is",123,"a","normal","line" "line","with "an" internal","quote" "short line","with an "internal quote", 1 comma and linebreaks" un "quot" ed,text,with,1,2,3,numbers "quoted","number","series","1,2,3" "invalid \xAB utf-8"
我对Ruby on Rails和Web编程也很陌生.有人能告诉我一些FasterCSV实现的例子.
我使用的是Rails 3.1.0.rc8和Chromium 15.0.874.102.
我想设置CSV下载的文件名.我按照这样做方案,但发现自己无法修改filename
的的Content-Disposition
头.
这是我的代码:
module ActionController
module CSVHelper
def render_csv options={}
if request.env['HTTP_USER_AGENT'] =~ /msie/i
headers['Pragma'] = "public"
headers['Content-Type'] = "text/plain"
headers['Cache-Control'] = "no-cache, must-revalidate, post-check=0, pre-check=0"
headers['Expires'] = "0"
else
headers['Content-Type'] = "text/csv"
end
filename = generate_filename options.delete(:basename)
headers['Content-Disposition'] = "attachment; filename=#{filename}"
end
def generate_filename basename=nil, suffix="csv"
filename = basename || params[:action]
filename << ".#{suffix}"
filename
end
end
end
Run Code Online (Sandbox Code Playgroud)
在我的控制器中:
respond_to do |format|
format.html
format.csv do
render_csv(:basename => "my_filename")
Rails.logger.debug "HEADERS: #{headers.to_s}" …
Run Code Online (Sandbox Code Playgroud) fastercsv content-disposition chromium http-headers ruby-on-rails-3
我们在为小应用程序创建批量上传功能时遇到了大量问题.我们正在使用FasterCSV gem将数据上传到MySQL数据库,但他更快的CSV在其要求中是如此抽象和精确,以至于它经常因格式错误的CSV错误和超时错误而中断.
csv文件通常是由用户从他们的网站或Microsoft Word文档粘贴文本创建的,因此期望数据中永远不会出现诸如智能引号或重音之类的奇怪字符是不合理的.此外,用户无法轻易识别他们的数据是否足以满足FasterCSV的要求.我们需要找到一种方法来自动修复它们.
在使用FasterCSV gem进程之前,是否有一种好的方法或可靠的工具来预处理CSV数据以修复数据中的任何nits?
我正在尝试从CSV文件将种子数据加载到我的Rails应用程序中.我最初安装了fastercsv gem,但是发现从ruby 1.9开始不推荐使用updatedcsv而支持CSV库.所以我在收到一个非常有用的错误告诉我切换后切换到CSV.
然而,现在,我得到了最奇怪的现象,当我加载我的数据时,一切看起来都很正常,但我似乎无法查询字符串字段.字符串字段由看似正确的字符串填充,但我无法访问它们.我可以查询任何数字字段,结果将返回,但不返回字符串字段.我尝试使用分隔符来报价,但无济于事.我甚至从我的csv文件中删除了所有引号,但仍然无法查询字符串字段.下面是我的代码,以及Rails控制台的一些示例查询和返回.
# seeds.rb
# ================
require 'csv'
directory = "db/init_data/"
file_name = "players.seed"
path_to_file = directory + file_name
puts 'Loading Player records'
# Pre-load All Player records
n=0
CSV.foreach(path_to_file) do |row|
Player.create! :first_name => row[1], :last_name => row[2], :position_id => row[5], :weight => row[6], :height => row[7], :year => row[8], :home_state => row[9], :home_town => row[10], :home_country => row[11], :high_school_id => row[12], :name => row[13]
n=n+1
end
Run Code Online (Sandbox Code Playgroud)
这是我的种子文件中的前两个记录.
# players.seed
"1","Allerik","Freeman","2011-10-11 22:21:21.230247","2011-10-11 22:21:21.230247","2","210","76","2013","NC","Charlotte","USA","1","Allerik Freeman"
"2","Kasey","Hill","2011-10-11 22:21:21.262409","2011-10-11 22:21:21.262409","1","170","73","2013","FL","Eustis","USA","2","Kasey …
Run Code Online (Sandbox Code Playgroud)