2016-11-28 8 views
1

Я пытаюсь извлечь табличные данные из символьного вектора, созданного пакетом pdftools. Выход (когда обрезается) выглядит следующим образом:Прочитать таблицу из PDF с помощью pdftools

pdftext <- c(" Clostridium perfringens  no./100ml   0  0   0  0  1409  0   0\n  Colony count 22°C   cfu/ml   -  0  15.673 >300.000  52  0   0\n  Colony count 37°C   cfu/ml   -  0  3.942  41  52  0   0") 
lines <- strsplit(pdftext,"\n") 
lines 
[[1]] 
[1] " Clostridium perfringens  no./100ml   0  0   0  0  1409  0   0" 
[2] "  Colony count 22°C   cfu/ml   -  0  15.673 >300.000  52  0   0" 
[3] "  Colony count 37°C   cfu/ml   -  0  3.942  41  52  0   0" 

Я был расщепление и соединение их в матрицу символов с помощью:

do.call(rbind,lapply(lines, function(x) {strsplit(x," [ ]+")})[[1]]) 

Это терпит неудачу, потому что есть только одно пространство между колонной, содержащей 15.673 >300.000.

Там может быть более чем один вопрос здесь:

  1. как я прохожу вектор символов в read.fwf?
  2. Вы можете предложить лучшее регулярное выражение, которое разделяет 15.673 >300.000, но не Colony count 22°C?
  3. есть ли простой способ разделить эту таблицу? Мой код выглядит немного неуклюжим.

спасибо.

+1

не идеален, но 'read.table (текст = pdftext, row.names = NULL)' close – rawr

+0

или 'read.csv (text = gsub ('{2,} | (? =>)', ', ', trimws (pdftext), perl = TRUE), row.names = NULL, stringsAsFactors = FALSE) ' – rawr

+1

@rawr' read.table' (и 'read.fwf') дать эту ошибку« Файл »должен быть символом строка или соединение ". Я должен был подробно остановиться на вопросе 1. Ваш код 'read.csv' выглядит лучше, чем первая строка становится заголовками столбцов – whanrott

ответ

1

Я отправил 3 вопроса. Это ответ на вопрос RegExp (2).

@rawr помог с лучшим выражением PCRE, но поскольку я работал с 500 отчетами, я обнаружил больше проблем. Я не мог найти правило, которое могло бы справиться со всеми вариантами, поэтому лучше RegExp не решит проблему. Границы столбцов также варьировались, поэтому фиксированная ширина не решила бы проблему, если бы я не обнаружил столбцы для каждой страницы.

Я решил проблему, разобрав вывод дважды. На первом проходе я разбился на {2,} (т.е.> = 2 пробела) и взял первые 2 столбца текста. На втором проходе я разделился на {1,} (т.е.> = 1 пробел) и взял последние 7 столбцов чисел. Оба прохода были принуждены к кадрам данных символьных векторов, а затем cbind объединили их.

 Смежные вопросы

  • Нет связанных вопросов^_^