【问题标题】:Ruby code to extract data from irregular text with intelligence用智能从不规则文本中提取数据的 Ruby 代码
【发布时间】:2013-11-28 15:44:56
【问题描述】:

我正在尝试编写一个 ruby​​ 代码来从不规则文本内容中提取特定位置的数据。

以下是我正在查看的文本内容。

                 Address1                                                   Address2                                       

 adress1, adress1, # 34 , adress1, 
 4th Floor, Plot # 14 & 15, 
 Drive,,                                                               HARIKA BHIMANI

 Madhapur, Hyderabad - 500081                                          2-14-117/35-1 Nas                   
 Andhra Pradesh                                                        AP                                                 
 +(91)40-00000000
 xyz@dabc.com

这是我的奇怪文本,我想分别提取 Address1 和 Address2。 我想我会尝试拆分,但没有得到如何分别提取 Address1 和 Address2,因为它们都在一行中。 Address1 和 Address2 的内容之间的空间肯定会超过 2 个空间。

我打算解析每一行并在每一行中分割字符串,分隔符超过 1 个空格。如何使用超过两个空格的分隔符分割 ruby​​ 中的字符串?

我们可以忽略上面文本中的前 2 行,从第 3 行开始。基本上我想分离左侧和右侧数据。分隔符多于 2 个空格。我已经用我的示例编码编辑了这个问题,但是如果左侧数据中的一行是空的,它就会失败

我尝试了以下示例

if !line.empty?

                splits =  line.split(/ {2,}/)

                case splits.length
                    when 2
                        puts "Address1 "+ splits[1]
                    when 3
                        puts "Address1 "+ splits[1]
                        puts "Address2 "+ splits[2] 
                    else

                end
            end

但以下示例失败

   leftSideHasData                    rightSideHasData
                                   OnlyRightSideHasData

如何在 Ruby 中实现这一点? ruby 是否提供任何 api 来轻松做到这一点?

【问题讨论】:

  • 你需要能够确认文本会遵循特定的模式,如果可以的话我可以帮你解析它,否则......
  • 您能否确保顶部的空白与它们下方的其余列保持一致。
  • 嗨我们可以忽略上面文本中的前2行,从第3行开始。基本上我想分离左侧和右侧数据。分隔符多于 2 个空格。我已经用我的示例编码编辑了这个问题,但是如果左侧数据中的一行是空的,它就会失败

标签: ruby parsing extract text-parsing


【解决方案1】:

text = %W{ Address1 Address2

地址1,地址1,#34,地址1, 4楼,地块#14和15, 驱动器,HARIKA BHIMANI

Madhapur, Hyderabad - 500081 2-14-117/35-1 Nas
安得拉邦 AP
+(91)40-00000000 xyz@dabc.com}

rows = text.split("\n").map { |row| row.split(/\s{2,}/) }

rows.each { |row| address1 << row[0]; address2 << row[1] }

address1
=> ["",
" adress1, adress1, # 34 , adress1, ",
" 4th Floor, Plot # 14 & 15, ",
" Drive,,",
" Madhapur, Hyderabad - 500081",
" Andhra Pradesh",
" +(91)40-00000000",
" xyz@dabc.com"]

地址2 => ["Address1", nil, nil, "HARIKA BHIMANI", "2-14-117/35-1 Nas", "AP", nil, nil]

您可以使用 address2.compact 删除 nil

【讨论】:

  • 嗨,bjhaid 我们如何解决我在问题中提出的失败案例?如果我们只有 rightSideData,那么只有 row[0] 会有字符串 OnlyRightSideHasData 的数据。但是使用您的代码,这将转到 address1 列表。而且我的数据的输入也将逐行进行。因此,我尝试并发布了上面的示例 sn-p,但我正在努力寻找一种情况,其中行仅包含 RightSideData。
  • 您是否正在从文件中读取文本,如果是,您可以发布指向示例的链接吗??
  • 没有。我正在使用 ruby​​ pdf-reader gem 通过调用 reader.page.text 来提取文本,然后通过分隔符 '\n' 拆分整个文本内容并解析每一行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
  • 2019-12-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 2018-02-25
相关资源
最近更新 更多