Tag: csv

导入CSV时,如何处理与关联对应的行中的数据?

我正在关注导入CSV Railscast ,它很直接。 问题是它只处理一个csv文件,该文件只包含1个文件中的1个模型中的信息。 说,我有一个CSV文件,我试图导入我的Listing模型。 在每行/列表上,它有一个名为Building的列,其中值实际上是该列表的building属性的名称(即@listing.building.name )。 如何在导入中处理这些情况? 这是Ryan在Railscast中获得的壁橱,Railscast在他的案例中属于Product模型: def self.import(file) CSV.foreach(file.path, headers: true) do |row| product = find_by_id(row[“id”]) || new product.attributes = row.to_hash.slice(*accessible_attributes) product.save! end end 所有发生的事情是他正在检查产品是否存在以及是否存在然后更新属性。 如果没有,则创建一个新的。 在这种情况下不太确定如何处理关联…特别是考虑到需要发生的事情是在相关记录不存在的情况下,需要在此过程中创建它。 所以回到我之前的building.name示例,如果没有Building.find_by_name(name) ,那么它应该创建一个新的构建记录。 思考?

忽略csv解析Rails的第一行

我正在使用本教程中的代码来解析CSV文件并将内容添加到数据库表中。 我如何忽略CSV文件的第一行? 控制器代码如下: def csv_import @parsed_file=CSV::Reader.parse(params[:dump][:file]) n = 0 @parsed_file.each do |row| s = Student.new s.name = row[0] s.cid = row[1] s.year_id = find_year_id_from_year_title(row[2]) if s.save n = n+1 GC.start if n%50==0 end flash.now[:message] = “CSV Import Successful, #{n} new students added to the database.” end redirect_to(students_url) end

Rails – CSV(导出到CSV)循环

我想以(在单独的文件中)获取前50名学生和接下来的50名学生等forms(导出为CSV)。 我已尝试使用下面给出的代码,我不知道如何生成循环,请提供一些代码来完成此过程。 @count =0 if @count == 0 students = Student.find(:all,:order => ‘name’, :limit => 50) @count = @count+1 else students = Student.find(:all,:order => ‘name’, :limit => 50, :offset => 50) @count = @count+1 点击导出到csv,它应该在不同的文件中获取前50名学生,接下来的50名学生等。 请告诉我们如何在上面的代码中添加循环,以便每隔50个学生获取一个单独的文件

将CSV写入stdout或文件名

我想创建一个方法,如果给定一些CSV输出写入文件名,如果没有给出,则写入stdout。 似乎我需要根据文件或stdout来区别对待我对CSV调用,但是我真的希望将输出流z视为我可以写入的内容而不是它是否是磁盘上的文件或者stdout流。 这可能吗? 以下是我的尝试和错误: require ‘csv’ require ‘pathname’ require ‘csv’ require ‘pathname’ def write_to_csv_or_stdout foo, bar, z=nil z = Pathname.new(z) if z z ||= $stdout res = [[foo, bar, “baz”]] CSV(z) do |csv| res.each do |row| csv < foo,bar,baz # write_to_csv_or_stdout “foo”, “bar”, “baz” # (NoMethodError)

如何使用RUBY比较CSV中的交替行

我有一个包含数千行的数据集。 我想计算一次警报在ALARM_OPENED和ALARM_NORMALIZED之间切换的次数 这是一个数据样本。 警报切换两次,因此理想情况下count = 2 现在的问题是我无法想象如何 1)比较事件类型的ALARM _OPENED和ALARM_NORMALIZED 2)比较事件变化之间的时间差(切换应在两秒的时间范围内发生。) count = 0 #loop this if event_type[0] = ‘ALARM_OPENED’ if event_type[1] = ‘ALARM_NORMALIZED’ #time[0] – time[1] = 2 seconds count = count + 1 end end p count

Ruby on rails,阅读和显示csv文件不起作用?

我在Ruby on Rails中实现,我只想要一些容易做的事情,我只想读取一个csv文件,然后在视图中显示输出。 我有一些代码对我来说似乎很好,但我总是得到错误:无法将Tempfile转换为String这是我的控制器: def match file = params[:file] @original_filename = file.original_filename tmpfile = Tempfile.new(“redmine_project_importer”) if tmpfile tmpfile.write(file.read) tmpfile.close tmpfilename = File.basename(tmpfile.path) if !$tmpfiles $tmpfiles = Hash.new end $tmpfiles[tmpfilename] = tmpfile else flash[:error] = “Cannot save import file.” return end session[:importer_tmpfile] = tmpfilename sample_count = 5 i = 0 @samples = [] FasterCSV.open(file, “r”) do […]

如何通过rails 3中的ftp写入csv文件?

我试图通过ftp写入csv文件。 这是我到目前为止: require ‘net/ftp’ require ‘csv’ users = User.users.limit(5) csv_string = CSV.generate do |csv| csv << ["email_addr", "first_name", "last_name"] users.each do |user| new_line = [user.email, user.first_name, user.last_name] csv << new_line end end csv_file = CSV.new(csv_string) ftp = Net::FTP.new('**SERVER NAME**') ftp.login(user = "**USERNAME**", passwd = "**PASSWORD**") ftp.storbinary('STOR ' + 'my_file.csv', csv_file) ftp.quit() 我得到错误“错误的参数数量(2个为3)”。 当我将行更改为ftp.storbinary(’STOR’+’my_file.csv’,csv_file,1024)时,它表示“错误的参数数量(1表示0)”。 我也试过使用storlines,但这也给了我错误。 有没有人对如何处理这个有什么想法?

为什么散列内容未保存到CSV文件中?

我在CSV文件中有一个专栏, Original.csv ,它有一堆用户ID,其中一些重复,如下所示: udid d0155049772de9 8b57d8c7f1e5a31e4adaef5fe6c52df1ada7fcd5 8b57d8c7f1e5a31e4adaef5fe6c52df1ada7fcd5 465088425ceb38c62bf8d1d9cc33bcfab4fe4293 3eabe40461773086 3eabe40461773086 e24356719f086021 212b5b0415560be3 1c046451a3761ef51fbf52759748f66c98b02313 我想稍后在MATLAB中处理它们,所以我想散列并将它们转换为整数并将它们存储在一个新文件New.csv 。 这是我的代码: require ‘csv’ udids = [] id=[] CSV.foreach(‘Original.csv’, :headers=>true).map do |row| udids << row[0] end udids=udids.uniq arrayHash=[] for i in 0..udids.size-1 arrayHash<<udids arrayHash<<i end hash = Hash[arrayHash.each_slice(2).to_a] id=hash.values_at *udids for i in 0..id.size-1 logfile = File.new('New.csv',"w") logfile.print("#{id[i]}\n") logfile.close end 由于某些原因我无法弄清楚,运行代码后New.csv文件为空。 […]

导入csv文件时,如何在2个模型中进行质量分配?

我可以使用单个模型中的属性导入CSV文件并创建一个新对象(在本例中列出)。 我把它放在了Listing模型中 accepts_nested_attributes_for :address 其中address是关联模型(地址有很多列表,列表属于地址)。 我以为我能够在导入CSV文件时从地址模型中批量分配属性,但是我收到错误: Can’t mass-assign protected attributes: unit_number 其中unit_number在地址模型中的一个属性中(它在attr中可访问)。

将上传的CSV文件中的行与rails中的用户相关联

我正在关注http://railscasts.com/episodes/396-importing-csv-and-excel的上半部分来上传CSV文件并在我的rails应用程序中创建新的“示例”。 我正在尝试创建一个仅显示当前用户样本的mysamples页面。 到目前为止,如果我通过表单一次添加一个样本,它将显示在此页面上。 但是当我上传CSV时,新样本没有与用户关联。 有关最佳方法的建议吗? 谢谢你的帮助。 Sample_Controller.rb class SamplesController params[:page], :per_page => 10 ) respond_with(@samples) authorize @samples end def mysample @samples = Sample.all authorize @samples end def import @samples = Sample.all if params[:file].present? Sample.import(params[:file], params[:user_id]) redirect_to root_url, notice: “Samples Imported” else redirect_to root_url, notice: “You need to choose a file first!” end authorize @samples end […]