Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 在保持单词列顺序的同时拆分字符串数组_Ruby_Regex_String - Fatal编程技术网

Ruby 在保持单词列顺序的同时拆分字符串数组

Ruby 在保持单词列顺序的同时拆分字符串数组,ruby,regex,string,Ruby,Regex,String,我有一根绳子 WP(PIL)/7/2013 PUBLIC AND PANCHAYAT MS PEMA BHUTIA MR. S.K. CHETTRI,\n KABI LUNGCHUK MS PANILA THEENGH ASST. GOVT.\n

我有一根绳子

        WP(PIL)/7/2013        PUBLIC AND PANCHAYAT               MS PEMA BHUTIA            MR. S.K. CHETTRI,\n                                KABI LUNGCHUK                      MS PANILA THEENGH         ASST. GOVT.\n                                CONSTITUENCY, NORTH                MS MON MAYA SUBBA         ADVOCATE\n                                SIKKIM                             MS TASHI DOMA SHERPA      MR. KARMA THINLAY,\n                                Vs                                 MR SANGAY GURMEY          CENTRAL GOVT.\n                                THE SECRETARY, MINISTRY            BHUTIA                    COUNSEL\n                                OF SURFACE TRANSPORT               MR. JORGAY NAMKA          MR THINLAY DORJEE\n                                AND ORS.                           MR. ZANGPO SHERPA,        BHUTIA\n                                                                   AMICUS CURIAE             MS POLLIN RAI, ASST.\n                                                                                             GOVT. ADVOCATE\n
我使用“\n”字符拆分了它。结果是

["        WP(PIL)/7/2013        PUBLIC AND PANCHAYAT               MS PEMA BHUTIA            MR. S.K. CHETTRI,",
"                                KABI LUNGCHUK                      MS PANILA THEENGH         ASST. GOVT.",
"                                CONSTITUENCY, NORTH                MS MON MAYA SUBBA         ADVOCATE",
"                                SIKKIM                             MS TASHI DOMA SHERPA      MR. KARMA THINLAY,",
"                                Vs                                 MR SANGAY GURMEY          CENTRAL GOVT.",
"                                THE SECRETARY, MINISTRY            BHUTIA                    COUNSEL",
"                                OF SURFACE TRANSPORT               MR. JORGAY NAMKA          MR THINLAY DORJEE",
"                                AND ORS.                           MR. ZANGPO SHERPA,        BHUTIA",
"                                                                   AMICUS CURIAE             MS POLLIN RAI, ASST.",
"                                                                                             GOVT. ADVOCATE"]
我想为每行提取4列(即将字符串数组转换为矩阵)。此外,提取的字符串应该属于关联的列。例如,最后一个字符串中的“GOVT.ADVOCATE”应被提取为['','','',GOVT.ADVOCATE']

我正在使用docsplit库解析包含表格数据的pdf。问题是pdf中的每一行都有一个内部表,它类似于下面指定的字符串数组


我尝试获取每列word的第一个字符的索引作为参考,并使用这些值来处理字符串,但未能找到有效的解决方案。

以下是基于我以上评论的解决方案:

require 'pp'

test_array = ["        WP(PIL)/7/2013        PUBLIC AND PANCHAYAT               MS PEMA BHUTIA            MR. S.K. CHETTRI,",
"                                KABI LUNGCHUK                      MS PANILA THEENGH         ASST. GOVT.",
"                                CONSTITUENCY, NORTH                MS MON MAYA SUBBA         ADVOCATE",
"                                SIKKIM                             MS TASHI DOMA SHERPA      MR. KARMA THINLAY,",
"                                Vs                                 MR SANGAY GURMEY          CENTRAL GOVT.",
"                                THE SECRETARY, MINISTRY            BHUTIA                    COUNSEL",
"                                OF SURFACE TRANSPORT               MR. JORGAY NAMKA          MR THINLAY DORJEE",
"                                AND ORS.                           MR. ZANGPO SHERPA,        BHUTIA",
"                                                                   AMICUS CURIAE             MS POLLIN RAI, ASST.",
"                                                                                             GOVT. ADVOCATE"]

class ColumnAnalyzer

  attr_reader :columns
  attr_accessor :array

  def initialize(array)
    @array = array
    analyze
  end

  def analyze
    lefts = Array.new
    rights = Array.new
    @array.each do |line|
      pos_left =  Array.new
      deconstruct = line.dup
      col = 0
      while m = deconstruct.match(/\s\s[^\s]{1}/) do
        left = m.offset(0)[0]+1
        pos_left[col] = col == 0 ? left : left + pos_left[col-1]
        col += 1
        deconstruct = deconstruct[left+1..-1]
      end
      lefts.push pos_left
      pos_right = Array.new
      deconstruct = line.dup
      col = 0
      while m = deconstruct.match(/[^\s]{1}\s\s/) do
        right = m.offset(0)[0]
        pos_right[col] = col == 0 ? right : right + pos_right[col-1]
        col += 1
        deconstruct = deconstruct[right+1..-1]
      end
      pos_right.push line.length
      rights.push pos_right
    end
    cols_l = lefts.collect { |a| a.size }.max 
    cols_r = rights.collect { |a| a.size }.max
    cols = [cols_l,cols_r].max # no. of columns
    @columns = Array.new
    (0..cols-1).each do |col|
      @columns[col] = Hash.new
      @columns[col][:l] = lefts.map { |a| a[col] }.min
      lefts.select { |a| a.size < cols }.map! { |a| a.unshift 0 }
      rights.select { |a| a.size < cols }.map! { |a| a.unshift 0 }
    end
    (0..cols-1).each do |col|
      @columns[col][:r]  = rights.map { |a| a[col] }.max
    end
  end

  def extract
    data = Array.new
    @array.each do |line|
      line_array = Array.new
      @columns.each do |col|
        line_array.push line[col[:l]..col[:r]].strip!
      end
      data.push line_array
    end
    data
  end

end

ca = ColumnAnalyzer.new(test_array)
data = ca.extract
pp ca.columns
pp data

=> [{:l=>7, :r=>21}, {:l=>28, :r=>54}, {:l=>62, :r=>85}, {:l=>87, :r=>113}]
[["WP(PIL)/7/2013",
  "PUBLIC AND PANCHAYAT",
  "MS PEMA BHUTIA",
  "MR. S.K. CHETTRI,"],
 ["", "KABI LUNGCHUK", "MS PANILA THEENGH", "ASST. GOVT."],
 ["", "CONSTITUENCY, NORTH", "MS MON MAYA SUBBA", "ADVOCATE"],
 ["", "SIKKIM", "MS TASHI DOMA SHERP", "MR. KARMA THINLAY,"],
 ["", "Vs", "MR SANGAY GURMEY", "CENTRAL GOVT."],
 ["", "THE SECRETARY, MINISTRY", "BHUTIA", "COUNSEL"],
 ["", "OF SURFACE TRANSPORT", "MR. JORGAY NAMKA", "MR THINLAY DORJEE"],
 ["", "AND ORS.", "MR. ZANGPO SHERPA,", "BHUTIA"],
 ["", "", "AMICUS CURIAE", "MS POLLIN RAI, ASST."],
 ["", "", "", "GOVT. ADVOCATE"]]
require'pp'
test_array=[“WP(PIL)/2013年7月公众和PANCHAYAT女士PEMA BHUTIA先生S.K.CHETTRI,”,
“KABI LUNGCHUK女士PANILA THEENGH副政府”,
“北选区MON MAYA SUBBA女士倡导者”,
“锡金TASHI DOMA SHERPA女士KARMA THINLAY先生,”,
“对SANGAY GURMEY先生中央政府”,
“布提亚律师部秘书”,
“地面运输部JORGAY NAMKA先生THINLAY DORJEE先生”,
“和ORS.ZANGPO SHERPA先生,BHUTIA”,
“法庭之友波林·雷女士,助理”,
“政府倡导者”]
类列分析器
属性读取器:列
属性存取器:数组
def初始化(阵列)
@数组=数组
分析
结束
def分析
lefts=Array.new
rights=Array.new
@数组。每个do |行|
pos_left=Array.new
解构=line.dup
col=0
而m=deconstruct.match(/\s\s[^\s]{1}/)do
左=米偏移量(0)[0]+1
左位置[col]=col==0?左:左+左位置[col-1]
col+=1
解构=解构[左+1..-1]
结束
向左。向左推位置
pos_right=Array.new
解构=line.dup
col=0
而m=deconstruct.match(/[^\s]{1}\s\s/)do
右=m.偏移量(0)[0]
位置右[col]=col==0?右:右+右位置[col-1]
col+=1
解构=解构[右+1..-1]
结束
右位置推线长度
向右推
结束
cols|u l=lefts.collect{| a | a.size}.max
cols|u r=rights.collect{| a | a.size}.max
cols=[cols_l,cols_r].最大列数
@columns=Array.new
(0..cols-1)。每个do|col|
@列[col]=Hash.new
@columns[col][:l]=lefts.map{| a | a[col]}.min
lefts.select{| a | a.size[{:l=>7,:r=>21},{:l=>28,:r=>54},{:l=>62,:r=>85},{:l=>87,:r=>113}]
[“WP(PIL)/7/2013”,
“公众和潘查亚特”,
“PEMA BHUTIA女士”,
“S.K.CHETTRI先生,”,
[,“KABI LUNGCHUK”,“PANILA THEENGH女士”,“副政府”],
[“”、“北选区”、“蒙玛亚苏巴女士”、“倡导者”],
[、“锡金”、“塔西·多马·舍普女士”、“卡玛·廷莱先生”],
[、“Vs”、“SANGAY GURMEY先生”、“中央政府”],
[、“部长”、“布提亚”、“律师”],
[“水陆运输公司”、“JORGAY NAMKA先生”、“THINLAY DORJEE先生”],
[、”和“ORS”、”赞波·夏尔巴先生“、”布提亚”],
[,,,“法庭之友”,“波林·雷女士,助理”],
[“”,“”,“”,“”,“,”政府倡导者“]]

我修复了上述问题。这不是一个完美的解决方案,但它适用于大多数情况

我假设数组中的第一个字符串最长(包含所有列的数据)

Docsplit与当前问题的上下文无关。不管怎样,加载项文件

gem 'docsplit', git: 'git@github.com:prasadsurase/docsplit.git', branch: 'layout-nopgbrk-support'
在控制台中运行以下代码以从pdf获取文本

Docsplit.extract_text(pdf_file_path, { layout: true, nopgbrk: true, output: "#{Rails.root}/tmp/pdf_to_text/" })
假设只有4个逻辑数据列

indices = arr.first.scan(/\s{2,}\S{2,3}\s{1}*/).map{|substr| arr.first.index(substr.strip) }
count = indices.count
actual_data = arr.map do |str|
  record = []
  count.times do |i|
    record << [count - 1  == i ? str[indices[i]..-1] : str[indices[i]..indices[i+1] - 1]]
  end
  record
end

details = [:first, :second, :third, :fourth].map do |indx|
  actual_data.map(&indx).join('').strip.gsub(/\s+/, ' ')
end
index=arr.first.scan(/\s{2,}\s{2,3}\s{1}*/).map{substr | arr.first.index(substr.strip)}
count=index.count
实际数据=arr.map do | str|
记录=[]
数一数,我数一数|

当我看到只有第一行有4个实际列,而所有其他行只有3个时,我有点害怕。这是打字错误,还是您的数据实际上是这样的?@TimBiegeleisen是实际数据。什么是列分隔符?如果可以定义模式,则可以使用正则表达式。否则,您应该手动执行。@WiktorStribiżew我们没有任何列分隔符。可以假设存在超过1个空间。我们唯一拥有的是带有换行符的字符串。我在换行符上断开了字符串,得到了这个数组。只有正则表达式没有帮助,因为最后一行字符串只有两个单词,逻辑上属于最后一列。在过去28年的大部分时间里,将这样的东西解析成数据结构一直是我的专业。不幸的是,没有通用的答案;您必须[a]制定一个适合数据的规范,[b]为该规范编写自定义解析器代码,[c]向上帝祈祷,数据永远不会违反您在f中制定的规范