Чтение многострочного файла с фиксированной шириной в R - PullRequest
2 голосов
/ 27 апреля 2020

У меня есть данные из файла PDF, который я читаю в R.

library(pdftools)
library(readr)
library(stringr)
library(dplyr)

results <- pdf_text("health_data.pdf") %>% 
  readr::read_lines()

Когда я читаю их этим методом, возвращается символьный вектор. Многострочная информация для данного столбца распределена по разным строкам (и не во всех столбцах для каждого наблюдения будут данные.

Воспроизводимый пример приведен ниже:

ex_result <- c("03/11/2012 BES 3RD          BES inc and corp           no-            no- sale -",
  "           group with                           sale        no- sale",  
  "           boxes",                                                                   
  "03/11/2012 KRS six and    firefly                  45       mg/dL  100 - 200",        
  "           seven",                                                                   
  "03/11/2012 KRS core    ladybuyg            55       mg/dL  42 - 87")

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

ex_result_width <- read_fwf(ex_result, fwf_widths(
  c(10, 24, 16, 7, 5, 15,100), 
  c("date", "name","description", "value", "unit","range","ab_flag")))

Я определил размеры набрав в консоли nchar с самой длинной строкой, которую я видел для этого столбца.

Используя fwf_widths, я могу получить столбец даты, определив аргумент width = с 10 байтами, но для Столбец ИМЯ, если я задаю ему 24 байта, он возвращает конкатенированные столбцы вместо строк, разделенных для учета многострочных данных, которые затем каскадно пересекаются с другими столбцами, которые теперь имеют неправильные данные, а остальные отбрасываются, когда заканчивается пространство.

В конечном итоге это желаемый результат:

desired_output <-tibble(
  date = c("03/11/2012","03/11/2012","03/11/2012"),
  name = c("BES 3RD group with boxes", "KRS six and seven", "KRS core"),
  description = c("BES inc and corp", "firefly", "ladybug"),
  value = c("no-sale", "45", "55"),
  unit = c("","mg/dL","mg/dL"),
  range = c("no-sale no-sale", "100 - 200", "42 - 87"),
  ab_flag = c("", "", ""))

Я пытаюсь увидеть:

  1. Как мне получить fwf_widths для распознавания многострочного текста и отсутствия Колум нс?
  2. Есть ли лучший способ чтения в файле pdf для учета многострочных значений и пропущенных столбцов? (Я читал этого урока , но, похоже, у него более структурированный PDF-файл)
...