【问题标题】:unable to parse multiple phone numbers via gsub and ||= ruby methods无法通过 gsub 和 ||= ruby​​ 方法解析多个电话号码
【发布时间】:2018-09-18 20:39:57
【问题描述】:

我目前正在将电话号码解析为 PDF 表单。我正在使用gem pdf-form,它也是用户pdftk。向我使用FormStack 的表单服务发出请求时,电话号码会以 JSON 格式返回。

我创建了一个DICTIONARY 来将 PDF 表单中的字段 ID 映射到 FormStack JSON 响应中的字段 ID。所以这样我就可以遍历它们。

DICTIONARY = {
    'Applicant Name'              => '66563757', #Name
    'DATE OF BIRTH mmddyyyy'      => '66563844', #Date of Birth
    ##
    'TELEPHONE NUMBER area code 1'=> '66563943', #Primary Phone - Area code (000)
    'TELEPHONE NUMBER first 3 1'  => '66563943', #Primary Phone - (000) 000
    'TELEPHONE NUMBER Last 4 1'   => '66563943', #Primary Phone - (000) 000-0000
    'CELLPHONE NUMBER area code 1'=> '66563947', #Secondary Phone - Area code (000)
    'CELLPHONE NUMBER first 3 1'  => '66563947', #Secondary Phone - (000) 000
    'CELLPHONE NUMBER Last 4 1'   => '66563947', #Secondary Phone - (000) 000-0000

    'TELEPHONE NUMBER area code 2'=> '66564485', #Phone - Area code (000)
    'TELEPHONE NUMBER first 3 2'  => '66564485', #Phone - first 3 - (000) 000
    'TELEPHONE NUMBER Last 4 2'   => '66564485', #Phone - last 4 - (000) 000-0000

     }

如您所见,电话号码分为前 3 位区号、后 3 位和最后 4 位。我创建了一个库来将此电话号码解析为 PDF 表单字段。 DICTIONARY 散列中的值是 FormStack 中数字表单中的字段。 USER_DATA 是传递给 initialize(user_submission_data) 的内容,这是填写表单时的用户数据。

class PdfScrie < FillablePdfForm

  def initialize(user_submission_data)
    @user_submission_data = user_submission_data
    super()
  end

  private

  DICTIONARY = {

  }

  APPLICANT_ADDRESS_FORM_FIELD_ID = "66563934"
  TENANT_REPRESENTATIVE_ADDRESS_FORM_FIELD_ID = "66564487"

  TELEPHONE_NUMBER_1_id = "66563943"
  CELLPHONE_NUMBER_1_id = "66563947"

  ADDRESS_FIELD_IDS = [
    APPLICANT_ADDRESS_FORM_FIELD_ID,
    TENANT_REPRESENTATIVE_ADDRESS_FORM_FIELD_ID,
  ].freeze

  PHONE_NUMBER_FIELD_IDS = [
    TELEPHONE_NUMBER_1_id,
    CELLPHONE_NUMBER_1_id
  ].freeze

  def fill_out
    form_fields.each do |field|
      id = DICTIONARY[field]
      @user_submission_data
        .select {|fd| fd[:field] == id}
        .each do |field_data|
          if address_field?(field_data[:field])
            break_address_into_state_city_zipcode(field_data[:value], field)
          elsif phone_number?(field_data[:field])
            parse_phone_number(field_data[:value])
            fill(field, @phone_number_sections.shift)
          else
            fill(field, field_data[:value])
          end
        end
    end
  end

  def address_field?(field)
    ADDRESS_FIELD_IDS.include?(field.to_s)
  end

  def break_address_into_state_city_zipcode(address, field)
    address_by_section = FormStack::Form.parse_formstack_nested_attrs(address)
    address_by_section.each do |section,value|
       fill(field, value) if form_field_has_section?(field, section)
    end
  end

  def form_field_has_section?(form_field_name, address_section)
    form_field_name.include? address_section.upcase
  end

  def parse_phone_number(phone_number)
    @phone_number_sections ||= phone_number.gsub(/\D+/, "").match(/(...)(...)(....)/).captures
  end

  def phone_number?(field)
    PHONE_NUMBER_FIELD_IDS.include?(field.to_s)
  end
end

但是,当迭代 PHONE_NUMBER_FIELD_IDS 时,只会解析第一个电话号码。当我运行 binding.pry fill_out 方法时,我可以看到这个数字实际上就是我要解析的那个。

[2] pry(#<PdfScrie>)> parse_phone_number(field_data[:value])
=> ["201", "785", "9896"]
[3] pry(#<PdfScrie>)> fill(field, @phone_number_sections.shift)
=> "201"

但是CELLPHONE_NUMBER_1_id没有被解析,我不明白为什么没有。

这是另一个库中的 fill 方法,用于将其解析为 PDF。

 def fill(key, value)
    attributes[ key.to_s ] = value
  end

  def pdftk
    @pdftk ||= PdfForms.new()
  end

【问题讨论】:

    标签: ruby algorithm pdf


    【解决方案1】:

    假设我正确阅读了您的代码,问题是空数组不是错误的。

    > foo = []
    # => []
    > foo ||= [1]
    # => []
    

    因此,在您处理完第一个电话号码后,第二个电话号码永远不会放入 @phone_number_sections 进行处理。

    您可能需要做的是像这样将新的捕获添加到部分中:

    def parse_phone_number(phone_number)
      @phone_number_sections ||= []
      @phone_number_sections += phone_number.gsub(/\D+/, "").match(/(...)(...)(....)/).captures
    end
    

    或者,由于看起来可能会多次添加数字,您可能必须这样做:

    def parse_phone_number(phone_number)
      if @phone_number_sections.nil? or @phone_number_sections.empty?
        @phone_number_sections = phone_number.gsub(/\D+/, "").match(/(...)(...)(....)/).captures
      end
    end
    

    【讨论】:

    • PHONE_NUMBER_FIELD_IDS 数组的值是 ["66563943", "66563947"],它们是映射到电话号码 [{:field=&gt;"66563947", :value=&gt;"(347) 222-2222"}, {:field=&gt;"66563943", :value=&gt;"(201) 785-9896"}] 的字段 id
    猜你喜欢
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2019-02-14
    • 2011-04-09
    • 1970-01-01
    相关资源
    最近更新 更多