Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 使用CSV联接表中的数组更新MongoDB_Ruby On Rails 3_Mongodb - Fatal编程技术网

Ruby on rails 3 使用CSV联接表中的数组更新MongoDB

Ruby on rails 3 使用CSV联接表中的数组更新MongoDB,ruby-on-rails-3,mongodb,Ruby On Rails 3,Mongodb,我想在我的MongoDB Colleges集合中添加一个嵌入式专业数组,如下所示: { "_id" : ObjectID("abc123"), "code" : 123456, "name" : "Stanford University", "majors" :["Agriculture", "Business", "Computer Science"... ] } 我有一个CSV,本质上是一个CollegesMajoins联接表(在SQL参考框架中)。它看起来像: 代码------主

我想在我的MongoDB Colleges集合中添加一个嵌入式专业数组,如下所示:

{ "_id" : ObjectID("abc123"), 
"code" : 123456, 
"name" : "Stanford University", 

"majors" :["Agriculture", "Business", "Computer Science"... ] }
我有一个CSV,本质上是一个CollegesMajoins联接表(在SQL参考框架中)。它看起来像:

代码------主代码------级别

123456----98765----2

123456----99999----2

我如何将这些专业(我可以先将MajorCode翻译成它的实际名称)嵌入到我的MongoDB学院收藏中

我一定有办法(伪代码):

也许我需要先把CSV转换成JSON文件

提前谢谢

更新

这是我在尝试Tilo的指令时遇到的错误-这可能与我对rails控制台不熟悉有关。它认为CSV.read指令正在加载一个nil对象

ruby-1.9.2-head :024 > csvAA = CSV.read( '/Users/administrator/dropbox/schoolninja/1College_Data/2009formatted/college_majors.csv' );
ruby-1.9.2-head :025 >   headersA = csvAA.shift;
ruby-1.9.2-head :026 >   csvAH = csvAA.map {|row| Hash[*headersA.zip(row).flatten] };
ruby-1.9.2-head :027 >   csvAH.each do |rowH|
ruby-1.9.2-head :028 >     c = College.find_by_code( rowH['Code'] )
ruby-1.9.2-head :029?>     c.majors ||= []
ruby-1.9.2-head :030?>   c.majors << ( rowH['title'] )
ruby-1.9.2-head :031?>   c.save
ruby-1.9.2-head :032?>   end
SyntaxError: (irb):24: unknown regexp options - adtratr
(irb):24: syntax error, unexpected tCONSTANT, expecting ')'
...opbox/schoolninja/1College_Data/2009formatted/college_majors...
...                               ^
(irb):24: syntax error, unexpected tIDENTIFIER, expecting $end
...nja/1College_Data/2009formatted/college_majors.csv );
...                               ^
    from /Users/administrator/.rvm/gems/ruby-1.9.2-head/gems/railties-3.0.9/lib/rails/commands/console.rb:44:in `start'
    from /Users/administrator/.rvm/gems/ruby-1.9.2-head/gems/railties-3.0.9/lib/rails/commands/console.rb:8:in `start'
    from /Users/administrator/.rvm/gems/ruby-1.9.2-head/gems/railties-3.0.9/lib/rails/commands.rb:23:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'
ruby-1.9.2-head:024>csvAA=CSV.read('/Users/administrator/dropbox/schoolnija/1College_Data/2009格式化/college_majors.CSV');
ruby-1.9.2-head:025>headersA=csvAA.shift;
ruby-1.9.2-head:026>csvAH=csvAA.map{| row | Hash[*headersA.zip(row.flatte]};
ruby-1.9.2-head:027>csvAH.each do|row|
ruby-1.9.2-head:028>c=College.通过代码查找
ruby-1.9.2-head:029?>c.majors | | |=[]
ruby-1.9.2-head:030?>c.majors c.save
ruby-1.9.2-head:032?>end
SyntaxError:(irb):24:未知的regexp选项-adtratr
(irb):24:语法错误,意外的tCONSTANT,应为“')”
…opbox/schoolninja/1大学数据/2009格式化/大学专业。。。
...                               ^
(irb):24:语法错误,意外的tIDENTIFIER,应为$end
…nja/1学院数据/2009格式/college_majors.csv);
...                               ^
来自/Users/administrator/.rvm/gems/ruby-1.9.2-head/gems/railties-3.0.9/lib/rails/commands/console.rb:44:在“开始”中
来自/Users/administrator/.rvm/gems/ruby-1.9.2-head/gems/railties-3.0.9/lib/rails/commands/console.rb:8:在“开始”中
来自/Users/administrator/.rvm/gems/ruby-1.9.2-head/gems/railties-3.0.9/lib/rails/commands.rb:23:in`'
来自脚本/rails:6:in'require'
来自脚本/rails:6:in`'
更新: 如果您想从csv文件的记录中更新MongoDB,请查看新的Ruby Gem“smarter_csv”。它有很多有用的特性,包括对大文件进行分块,并以哈希数组的形式返回分块结果

另见:

最新答复:
需要“更智能的”csv
filename='/tmp/college_majors.csv'
#:key_映射重命名一列并忽略列“Level”
#CSV文件的每一行都被转换成一个带有键::major_code,:code的散列
进程(文件名,{:chunk\u size=>10,
:key_mapping=>{:level=>nil}})do| chunk|
#我们正在传入一个块来处理每个结果哈希/行(块接受哈希数组)。
#如果CSV文件很大,我们可以将其分块并行处理(使用Resque Workers)。
#为此,我们将把下面的块提取到一个Resque worker中,而只创建
#每个区块都有一个新的重新生成作业。
chunk.each do|散列|
c=学院。按代码查找(哈希[:代码])
c、 专业| |=[]
c、 专业[“代码”、“专业代码”、“等级”]、[“123456”、“98765”、“2”]、[“123456”、“9999”、“2”]
headersA=csvAA.shift#将标题提取到数组中
#=>[“代码”、“主代码”、“级别”]
#将包含CVS数据的“数组数组”转换为“哈希数组”:
csvAH=csvAA.map{| row | Hash[*headersA.zip(row.flatte]}
#=>[{“代码”=>“123456”,“MajorCode”=>“98765”,“级别”=>“2”},{“代码”=>“123456”,“MajorCode”=>“99999”,“级别”=>“2”}]
csvAH.每个人都在划船|
c=学院。按代码查找(rowH['code'])
c、 majors | |=[]#如果不存在,则初始化为空数组

c、 我希望有一天我能像你一样聪明。这太棒了。我明天会试试这个-如果它有效的话,我会把它标记为正确的。你是从Ruby控制台还是从MongoDB控制台来做这件事的?在Ruby控制台中,csvAA=CSV.read(…)似乎返回一个nil object.Hm。我遇到了一个错误,可能与我对rails控制台不熟悉有关。我会在上面发帖-也许你知道发生了什么?谢谢。查看Ruby Gem smarter\u csv文件名没有引号,例如“或”-我编辑了你的文章并在文件名周围添加了引号谢谢你的帮助。带引号的代码会导致:NameError:uninitialized constant csv在运行此代码之前,您需要
require'csv'
,这样Ruby就知道您想要使用csv库了,谢谢-我相信我就快到了。现在我有了一个“NoMethodError:undefined method`find_by_code'for College:Class”在大学类/模型中需要一个属性“code”
ruby-1.9.2-head :024 > csvAA = CSV.read( '/Users/administrator/dropbox/schoolninja/1College_Data/2009formatted/college_majors.csv' );
ruby-1.9.2-head :025 >   headersA = csvAA.shift;
ruby-1.9.2-head :026 >   csvAH = csvAA.map {|row| Hash[*headersA.zip(row).flatten] };
ruby-1.9.2-head :027 >   csvAH.each do |rowH|
ruby-1.9.2-head :028 >     c = College.find_by_code( rowH['Code'] )
ruby-1.9.2-head :029?>     c.majors ||= []
ruby-1.9.2-head :030?>   c.majors << ( rowH['title'] )
ruby-1.9.2-head :031?>   c.save
ruby-1.9.2-head :032?>   end
SyntaxError: (irb):24: unknown regexp options - adtratr
(irb):24: syntax error, unexpected tCONSTANT, expecting ')'
...opbox/schoolninja/1College_Data/2009formatted/college_majors...
...                               ^
(irb):24: syntax error, unexpected tIDENTIFIER, expecting $end
...nja/1College_Data/2009formatted/college_majors.csv );
...                               ^
    from /Users/administrator/.rvm/gems/ruby-1.9.2-head/gems/railties-3.0.9/lib/rails/commands/console.rb:44:in `start'
    from /Users/administrator/.rvm/gems/ruby-1.9.2-head/gems/railties-3.0.9/lib/rails/commands/console.rb:8:in `start'
    from /Users/administrator/.rvm/gems/ruby-1.9.2-head/gems/railties-3.0.9/lib/rails/commands.rb:23:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'
require 'smarter_csv'
filename = '/tmp/college_majors.csv'
# The :key_mapping renames one column and ignores the column "Level"
# Each line of the CSV-file is converted into a hash with keys: :major_code, :code
n = SmarterCSV.process(filename, {:chunk_size => 10,
                       :key_mapping => {:level => nil} }) do |chunk|
  # We're passing a block in to process each resulting hash / row (block takes array of hashes).
  # If the CSV-file is large, we can process it in parallel in chunks (using Resque Workers).
  # For this we would extract the following block into a Resque worker and instead just create 
  #   a new Resque job for each chunk.

  chunk.each do |hash|
    c = College.find_by_code( hash[:code] )
    c.majors ||= []
    c.majors << majorcode_to_name( hash[:major_code] )
    c.save
  end
end
require 'csv'

csvAA = CSV.read( csv_filename )   # returns an array of arrays
# => [["Code", "MajorCode", "Level"], ["123456", "98765", "2"], ["123456", "99999", "2"]] 

headersA = csvAA.shift   # extract the headers into an array
# => ["Code", "MajorCode", "Level"]

# turn the "array of arrays" which contain the CVS data, into an "Array of Hashes":
csvAH = csvAA.map {|row| Hash[*headersA.zip(row).flatten] }
# => [{"Code"=>"123456", "MajorCode"=>"98765", "Level"=>"2"}, {"Code"=>"123456", "MajorCode"=>"99999", "Level"=>"2"}] 

csvAH.each do |rowH|
  c = College.find_by_code( rowH['Code'] )
  c.majors ||= []                                 # initialize as empty array if it doesn't exist
  c.majors << majorcode_to_name( rowH['MajorCode'] )
  c.save
end
require 'csv'

headersA = nil
CSV.foreach do |row|
  if headersA.nil?
    headersA = row 
  else
    rowH = Hash[*headersA.zip(row).flatten]
    
    c = College.find_by_code( rowH['Code'] )
    c.majors ||= []                                 # initialize as empty array if it doesn't exist
    c.majors << majorcode_to_name( rowH['MajorCode'] )
    c.save
  end
end