我正在使用 savon gem 来处理一个非常糟糕的肥皂响应,例如:
["12|310|T02-260|", "14|130|T01-110|CAR 27", ...]
我需要在管道符号处拆分它们并将它们映射到模型属性。有什么建议么?
我正在使用 savon gem 来处理一个非常糟糕的肥皂响应,例如:
["12|310|T02-260|", "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、sequence number 和 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">
让给定的数组是soap_response
def deal_with_pipe_symbols(soap_response)
outer_array = []
soap_response.each do |element|
outer_array << element.split('|')
end
outer_array
end
这个方法应该返回一个看起来像下面这样更可行的数组。
[['12','310','T02-260',''], ['14','130','T01-','CAR 27'], ...]
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"]]