2016-11-28 8 views
1

pdftoolsパッケージで生成された文字ベクトルから表データを抽出しようとしています。私が使用して文字行列の中にこれらを分割し、参加してきましたpdftoolsを使用してPDFからテーブルを読み取る

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(text = 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')はこのエラーを返します" fileは文字でなければなりません文字列または接続 "。私は質問1で詳しく述べるべきだったはずです。あなたの 'read.csv'コードは、最初の行が列見出しになることを除いて、よりよく見えます – whanrott

答えて

1

私は3つの質問を投稿しました。これは、RegExpの質問(2)への回答です。

@rawrはより良いPCRE式を助けましたが、私が500のレポートを処理したとき、私はより多くの問題を発見しました。私はすべてのバリエーションに対処できるルールを見つけることができなかったので、RegExpは問題を解決できなかったでしょう。各ページの列が検出されない限り、固定幅でも問題は解決されませんでした。

出力を2回解析することで問題を解決しました。最初のパスで私は{2,}(すなわち> = 2スペース)で分割し、テキストの最初の2列を取った。 2回目のパスでは、私は{1,}(すなわち> = 1スペース)で分割し、最後の7列の数字を取った。両方のパスは、文字ベクトルのデータフレームに強制的に変換され、次にcbindが結合されました。

関連する問題