根据数组值和条件编辑哈希值



我的哈希如下:

random_data = {
0=>{"ABC"=>"201604", "CDE"=>"0002874", "TPP"=>"000004971821467", "APD"=>"00182", "PRODUCTID"=>"ACH", "OPP"=>"00000000000176564", "CTC"=>"00000000000286920"}, 
1=>{"ABC"=>"301604", "CDE"=>"0001074", "TPP"=>"000004971821467", "APD"=>"00182", "PRODUCTID"=>"ACH", "OPP"=>"00000000000119964", "CTC"=>"00000000000211920"}
}

和两个阵列如下:

arr1 = [CHAR,NUMBER,NUMBER,NUMBER,CHAR,NUMBER,CHAR]
arr2 = [6,(7,0),(15,0),(5,0),3,(15,2),17]

ARR1和ARR2的元素用哈希值映射,条件如下:

  1. 如果array arr1的元素是char,请对哈希的值无能为力。
  2. 如果数组arr1的元素是数字,则哈希 random_data中的相应元素应转换为整数,即应删除领先的零。

例如,arr1 [1]为"数字",因此对于哈希的每个第二个元素,领先的零都应被删除。

即。" cde" =>" 0002874"应该成为" CDE" =>" 2874"

  1. 如果arr1是数字,而arr2元素的第二位数不是0,则应在哈希中添加十进制。举个例子:arr1 [5] =数字arr2 [5] =(15,2)

hash OPP中的第五个元素应该像这样" opp" =>" 1199.64",即为十进制添加了2个位置(15,2)

预期输出如下:

random_data = {
0=>{"ABC"=>"201604", "CDE"=>"2874", "TPP"=>"4971821467", "APD"=>"182", "PRODUCTID"=>"ACH", "OPP"=>"1765.64", "CTC"=>"00000000000286920"}, 
1=>{"ABC"=>"301604", "CDE"=>"1074", "TPP"=>"4971821467", "APD"=>"182", "PRODUCTID"=>"ACH", "OPP"=>"1199.64", "CTC"=>"00000000000211920"}
}
arr1 = %w| CHAR NUMBER NUMBER NUMBER CHAR NUMBER CHAR |
  #=> ["CHAR", "NUMBER", "NUMBER", "NUMBER", "CHAR", "NUMBER", "CHAR"]
arr2 = [6, [7,0], [15,0], [5,0], 3, [15,2], 17]

enum = arr1.zip(arr2).map { |type, obj| type=="CHAR" ? type : obj.last }.to_enum
  #=> #<Enumerator: ["CHAR", 0, 0, 0, "CHAR", 2, "CHAR"]:each> 
random_data.each do |k,h|
  h.update(h) do |*,v|
    obj = enum.next 
    case obj 
    when "CHAR"
      v
    else
      x = v.to_i
      x = x.to_f/10**obj if obj > 0
      x.to_s
    end  
  end
  enum.rewind
end
  #=> {0=>{"ABC"=>"201604", "CDE"=>"2874", "TPP"=>"4971821467", "APD"=>"182",
  #        "PRODUCTID"=>"ACH", "OPP"=>"0.17", "CTC"=>"00000000000286920"},
  #    1=>{"ABC"=>"301604", "CDE"=>"1074", "TPP"=>"4971821467", "APD"=>"182",
  #        "PRODUCTID"=>"ACH", "OPP"=>"1199.64", "CTC"=>"00000000000211920"}} 
arr1 = %w|CHAR NUMBER NUMBER NUMBER CHAR NUMBER CHAR|
arr2 = [6, [7,0], [15,0], [5,0], 3, [15,2], 17]
types = arr1.zip(arr2)
random_data.map do |_, hash|
  hash.map.with_index do |(k, v), idx|
    type, digits = types[idx]
    [
      k, 
      type == 'NUMBER' ? v.to_i.to_s.tap do |s|
        s[/(?=.{#{[*digits][1]}}z)/] = '.' unless [*digits][1].zero?
      end : v
    ]
  end
end

最新更新