我的哈希如下:
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的元素用哈希值映射,条件如下:
- 如果array
arr1
的元素是char,请对哈希的值无能为力。 - 如果数组
arr1
的元素是数字,则哈希random_data
中的相应元素应转换为整数,即应删除领先的零。
例如,arr1 [1]为"数字",因此对于哈希的每个第二个元素,领先的零都应被删除。
即。" cde" =>" 0002874"应该成为" CDE" =>" 2874"
- 如果
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