如何在两个阵列之间进行匹配并根据条件更新一个阵列

时间:2014-04-03 10:43:20

标签: ruby arrays csv

我试图匹配两个供应商csv并根据另一个供应商的结果更新一个;如果价格不同,请使用另一个文件的匹配项更新一个文件。如果产品位于第一个csv但不在另一个csv中,则更新它。调整数据集后,我会将其写回到我可以使用的csv。每个供应商文件长约9000行。代码中两个Puts行的样本数据为:

#<struct RecordBUY item_type=nil, buy_product_id="1000", product_name="Plastic Jeweled     Crown", product_type=nil, product_code_SKU="105238", option_set=nil, duplicate={"1000"=>["105238"]}, brand_name="Rubies Costumes", prod_desc="This plastic crown has six large jewel stones accross the top.  Adjustable headband. (Colors of the jewel stones may vary, our choice please.)", cost_price="$3.76", prod_weight="00.14", prod_width="5.75", prod_height="0.5", prod_depth="23.5", prod_category="Hats, Wigs & Masks", prod_upn="082686025935", prod_size="One Size", prod_color="Gold">
#<struct BCRecord item_type="Product", bc_product_id="620", product_name="Dollar Ring", product_type=nil, product_code_SKU="109624", option_set=nil, duplicate=nil, brand_name="Rubies Costumes", prod_desc="Ring has three large glittery Dollar Signs '$'  that extend over your fingers.", cost_price="3.20", prod_weight="0.7200", prod_width="4.0000", prod_height="1.0000", prod_depth="7.0000", prod_category="Accessories & Makeup", prod_upn="82686006996", prod_size=nil, prod_color=nil, option_set=nil, price="5.60", allow_purchases=[21]>

我将csv数据读取到各个对象的数组中,但不知道如何有效地进行搜索和更新。我没有遇到过概念,以避免坏的(或者在9k线上做坏事实际上是不好或只是不赞成)。我所拥有的是:

puts records[0]
puts recordsBC[1]

#start script
records.each do | buyline |
  recordsBC.each do | bcline |
    if bcline.product_code_SKU == buyline.product_code_SKU
      ##update pricing (brute force);
      #bcline.price = buyline.cost_price * 1.75 #this fails with undefined method `price=' for #<Record:0x007fbb9088b960> 
      bcline.cost_price = buyline.cost_price
    end

    ##if product is in BC currently, but not in buy - needs to be marked as inactive in BC
    if bcline.product_code_SKU.include? buyline.product_code_SKU
      #bcline.allow_purchases = "N" # this fails with undefined method `allow_purchases=' for #<Record:0x007fb2878822c8> 
    end
    #if product is in Buy but not in BC then add it into BC
    if buyline.product_code_SKU.include? bcline.product_code_SKU
      recordsBC.push buyline
    end
  end
end

我无法找到更好的方法,也无法理解为什么我会在某些但不是所有线路上获得未定义的方法错误。我没有完成答案,只是足以找出解决方案的其余部分。

1 个答案:

答案 0 :(得分:0)

我首先要减少迭代次数。目前,您正在迭代每个buyline的所有记录。所以我从:

开始
records.each do | buyline |
  record_subset = recordsBC.select{|r|!(r.product_code_SKU.split & buyling.product_code_SKU.split).empty?}

  record_subset.each do |bcline|
  .....

  end
end

这应该意味着您只遍历具有匹配product_code_SKU的bcline项目。您可能必须修改拆分,因为您的示例并未显示多个SKU是如何分开的(例如,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 456&#39)