Ruby on rails 在ruby 1.9中将管道分隔字符串数组转换为映射
我使用savon gem来处理一个非常糟糕的soap响应,比如:Ruby on rails 在ruby 1.9中将管道分隔字符串数组转换为映射,ruby-on-rails,ruby,savon,Ruby On Rails,Ruby,Savon,我使用savon gem来处理一个非常糟糕的soap响应,比如: ["12|310|T02-260|", "14|130|T01-110|CAR 27", ...] 我需要在管道符号处拆分这些对象,并将它们映射到模型属性。有什么建议吗?让给定的数组成为soap\u response def deal_with_pipe_symbols(soap_response) outer_array = [] soap_response.each do |element| outer_ar
["12|310|T02-260|", "14|130|T01-110|CAR 27", ...]
我需要在管道符号处拆分这些对象,并将它们映射到模型属性。有什么建议吗?让给定的数组成为
soap\u response
def deal_with_pipe_symbols(soap_response)
outer_array = []
soap_response.each do |element|
outer_array << element.split('|')
end
outer_array
end
def用管道符号处理(soap\u响应)
外部_数组=[]
soap|u response.each do|元素|
外部数组stdlib中的CSV库应该很好地做到这一点(它理解引用等),这里我加入了这些行,但是您可以独立地解析它们,它们将位于更深的数组中
require 'csv'
inputs = ["12|310|T02-260|", "14|130|T01-110|\"CAR|27\""]
result = CSV.parse inputs.join("\n"), col_sep: '|'
result # => [["12", "310", "T02-260", nil], ["14", "130", "T01-110", "CAR|27"]]
这将获得哈希数组
fields = [:a, :b, :c, :d]
response.map{ |r| Hash[*fields.zip(r.split('|')).flatten] }
结果=[{:a=>1,:b=>2,:c=>3,:d=>4},…]
例如,假设您需要获取并设置id、序列号和skw。
这有帮助吗
class Foo
attr_accessor :id, :seq, :skw
def initialize(soap_res)
%w{id seq skw}.zip(soap_res.split "|").each do |(attr, val)|
self.send("#{attr}=", val)
end
end
end
1.9.3p194 :057 > f = Foo.new "12|310|T02-260"
=> #<Foo:0x007ff1ea8e0970 @id="12", @seq="310", @skw="T02-260">
class-Foo
属性访问器:id,:seq,:skw
def初始化(soap_res)
%w{id seq skw}.zip(soap_res.split“|”)。每个do |(attr,val)|
self.send(“#{attr}=”,val)
结束
结束
结束
1.9.3p194:057>f=Foo.new“12 | 310 | T02-260”
=> #
如何将拆分的内容映射到模型中的属性?e、 g.[:a=>“12”,:b=>“310”,:c=>“T02-260”]