1

我正在使用 savon gem 来处理一个非常糟糕的肥皂响应,例如:

["12|310|T02-260|", "14|130|T01-110|CAR 27", ...]

我需要在管道符号处拆分它们并将它们映射到模型属性。有什么建议么?

4

4 回答 4

2

这将为您提供哈希数组

fields = [:a, :b, :c, :d]
response.map{ |r| Hash[*fields.zip(r.split('|')).flatten] }

结果 =[ {:a => 1, :b => 2, :c => 3, :d => 4}, ... ]

于 2012-08-08T05:25:38.553 回答
1

举个例子,假设你需要获取和设置一个 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">  
于 2012-08-08T05:30:47.257 回答
0

让给定的数组是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'], ...]

于 2012-08-08T05:19:34.917 回答
0

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"]]
于 2012-08-08T05:25:37.023 回答