LoginSignup
21
23

More than 5 years have passed since last update.

【word】docxtractrパッケージで.docx内の表からデータを抽出する【これはすごい】

Last updated at Posted at 2015-08-25

キャプテンアメリカが一晩でやってくれました。

こんな話があったそうです。

これに対し、Rudisは「Yes」と答え、たった数時間のうちに素晴らしいパッケージを開発しました。

パッケージ開発の経緯や詳細についてはRudisの記事を見てください。

ちょっとした説明をすると、Microsoftのofficeファイル(.docxや.xlsx)はXMLで記述されているので、うまいこと処理すればデータを抽出できます。{docxtractr}はこの処理を関数としてまとめ、パッケージとして提供するものです。GitHubにリポジトリがあるのでインストールして試してみました。

こんなテーブル(7 * 5)を2つもつファイル(npb.docx)を用意しました。

npb.png

どう見てもわーどふぁいるです。本当にありがとうございました。という感じでここからデータ抽出する、という話は手打ちでやる必要があったり、見ただけで嫌になるわーどふぁいる内での表データです。

ですが、{docxtractr}を使えばそんな気だるさとおさらば!R上でさくっと表データを扱うことができます。

まずはGitHubからパッケージをインストールしてきます。

# devtools::install_github("hrbrmstr/docxtractr")
library(docxtractr)

docxファイルを読み込む

read_docx関数を使って表データが含まれる.docxファイルを読み込みます。

doc.table <- read_docx(path = "npb.docx")
doc.table # docx_describe_tbls(doc.table)
## Word document [npb.docx]
## 
## Table 1
##   total cells: 35
##   row count  : 7
##   uniform    : likely!
##   has header : likely! => possibly [順位, 球団名, 勝ち, 負け, 分け]
## 
## Table 2
##   total cells: 35
##   row count  : 7
##   uniform    : likely!
##   has header : likely! => possibly [順位, 球団名, 勝ち, 負け, 分け]
class(doc.table)
## [1] "docx"

docxというクラスのオブジェクトです。出力を見ると、どのような表なのかがわかります。

# 読み込んだdocxファイル中に含まれる表の数
docx_tbl_count(doc.table)
## [1] 2

個々の表データを取り出す

docx_extract_tblを使って、一つ一つの表データを取り出すことができます。また、Rのデータフレーム操作と同様の添字処理なども可能です。

docx_extract_tbl(docx = doc.table, tbl_number = 1, header = TRUE)
## Source: local data frame [6 x 5]
## 
##   順位   球団名 勝ち 負け 分け
## 1    1     阪神   60   52    1
## 2    2     巨人   59   56    1
## 3    3 ヤクルト   56   57    1
## 4    4     広島   52   57    1
## 5    5     DeNA   52   62    1
## 6    6     中日   50   62    2
docx_extract_tbl(docx = doc.table, tbl_number = 2, header = TRUE)[2]
## Source: local data frame [6 x 1]
## 
##         球団名
## 1 ソフトバンク
## 2       日ハム
## 3         西武
## 4       ロッテ
## 5         楽天
## 6   オリックス
docx_extract_tbl(docx = doc.table, tbl_number = 2, header = TRUE) %>% 
  dplyr::filter(`勝ち` > 50) %>% 
  knitr::kable()
順位 球団名 勝ち 負け 分け
1 ソフトバンク 71 34 3
2 日ハム 65 46 1
3 西武 54 56 5
4 ロッテ 52 55 1

こうしてdocxから取り出したオブジェクトはtbl_dfおよびdata.frameクラスとなり、R上で扱いやすい形式になります。日本語でも問題ないようですし、このパッケージで救われる人がたくさん出そうですね。素晴らしい。

21
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
23