разбить массив строк слов, сохраняя порядок слов в столбце - PullRequest
0 голосов
/ 30 мая 2018

У меня есть строка как

        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 столбца для каждой строки (т.е. преобразовать массив строк в матрицу).Кроме того, извлеченная строка должна принадлежать связанному столбцу.например, «ПРАВИТЕЛЬСТВО.ADVOCATE 'в последней строке должен принадлежать как [' ',' ',' ',' GOVT.ADVOCATE ']

Я использую библиотеку docsplit для анализа PDF, содержащего табличные данные.Проблема в том, что каждая строка в pdf имеет внутреннюю таблицу, которая похожа на массив строк, которые указаны ниже.

Я попытался получить индекс первого символа слова для каждого столбца в качестве ссылки и использоватьэти значения для обработки строк, но у них не было рабочего решения.

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Я исправил вышеуказанную проблему.Это не идеальное решение, но оно работает для большинства случаев.

Я предположил, что первая строка в массиве самая длинная (содержит данные для всех столбцов).

Docsplit не имеет значенияв контексте текущего вопроса.В любом случае добавьте Gemfile

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

подробности представляет собой массив из 4 строк.

0 голосов
/ 31 мая 2018

Вот мое решение на основе моего комментария выше:

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"]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...