【问题标题】:convert "denormalised" hash转换“非规范化”哈希
【发布时间】:2013-08-23 12:03:39
【问题描述】:

我正在处理一个包含“非规范化”键的文件,并将其读入哈希。

哈希部分看起来像这样:

:primer_left_0_sequence=>"TCCTTCCTGCAGCCATGAAG",    :primer_right_0_sequence=>"GGCCTCGGCACTTACTTCAT", :primer_left_0=>"90,20", :primer_right_0=>"195,20", :primer_left_0_tm=>"60.035", :primer_right_0_tm=>"60.108", :primer_left_0_gc_percent=>"55.000", :primer_right_0_gc_percent=>"55.000"

稍后重复相同的键,但键中嵌入的数字不同:

:primer_left_2_sequence=>"TTCTCTCCCTCCTTCCTGCA", :primer_right_2_sequence=>"GGCCTCGGCACTTACTTCAT", :primer_left_2=>"81,20", :primer_right_2=>"195,20", :primer_left_2_tm=>"59.883", :primer_right_2_tm=>"60.108", :primer_left_2_gc_percent=>"55.000",

重复多次,每次嵌入在密钥中的整数可能不同。 我想将此数据加载到表中,其中列名与键相同,但没有嵌入整数。每次有新的重复信息集,我都会插入一个新行。

类似这样,但我不知道如何处理嵌入到密钥中的整数:

rawfile_hash.each do |key, value|
  # if a new key integer, then create a new record
  # ie: primer3_output = Primer3Output.new
  if primer3_output.class.accessible_attributes.include?(key)
    primer3_output.send("#{key}=", value)
  end
end

编辑

为了清楚起见,我正在寻找代码来做这样的事情:

primer3_output = Primer3Output.new    
primer3_output.primer_left_sequence = rawfile_hash[:primer_left_0_sequence]
primer3_output.primer_right_sequence = rawfile_hash[:primer_right_0_sequence]
... many entries later ...
primer3_output.save
primer3_output = Primer3Output.new
primer3_output.primer_left_sequence = rawfile_hash[:primer_left_2_sequence]
primer3_output.primer_right_sequence = rawfile_hash[:primer_right_2_sequence]
... etc ...

解决方案

如果重新打开,我会将其添加为答案。

作为 rake 任务

namespace :db do
  task load_table: :environment do
    results = []
    row = 0
    File.open(Rails.root.join("lib", "assets", "P3_INPUT_577_8328_1197.raw"), "r").each_line do |line|
    key, value = line.strip.split("=")
    id = key.scan(/\d+/).first.to_i
    column_name = key.gsub(/_\d+/, "").downcase
    results[id] = {"primer3_parameter_id" => id} unless results[id]
    results[id][column_name] = value
    if id > row
      PrimerPair.create!(results[row])
      results[row] = nil
      row = id
    end
  end
  PrimerPair.create!(results.last)
end

结束

【问题讨论】:

  • 举个例子说明列名应该是什么。
  • 在 EDIT 下添加了更多细节
  • 我在编辑下添加了一个描述...源数据在变量名称中嵌入了一个实例编号,我只想提取没有实例编号的变量,每次迭代实例作为一个新对象。请参阅编辑部分。干杯。

标签: ruby-on-rails ruby metaprogramming


【解决方案1】:

很难准确判断你想做什么,但根据我从你那里收集到的问题,这应该可行;

rawfile_hash.each do |key, value|
  # if a new key integer, then create a new record
  # ie: primer3_output = Primer3Output.new
  key.gsub!(/_\d+/,"") # simple regex
  if primer3_output.class.accessible_attributes.include?(key)
    primer3_output.send("#{key}=", value)
  end
end

编辑

Re:您在下面的评论 - 您可以在数据库中包含一个额外的列,并按该值查找或创建记录,这样您仍然可以按它排序。像这样的东西;

i = key.gsub(/[^0-9]/,"").to_i
key = key.gsub(/_\d+/,"")
Primer3Output.find_or_create_by(:i => i)

【讨论】:

  • 看起来不错,谢谢。我仍然需要弄清楚如何在散列中的整数递增时插入新行......并且需要以某种方式按嵌入的整数对散列进行排序。哇!感谢您的回答....我会稍微玩一下代码。
猜你喜欢
  • 1970-01-01
  • 2020-12-13
  • 2017-10-27
  • 2013-08-21
  • 2016-05-13
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
相关资源
最近更新 更多