省庁や団体が公開している白書など、PDFとして配布されている文書に掲載されている「表」をExcelに取り込んで使用したいケースもあるだろう。このような場合にもパワークエリが活用できる。今回は、PDFからデータを取得するときの操作手順などを紹介していこう。

PDFからデータを取得する手順

今回は、PDFからデータを取得する方法を紹介していこう。省庁や団体が公開しているデータをもとにExcelで資料を作成したり、データを分析したりする際に活用できるので、ぜひ覚えておくとよい。

  • PDFからデータを取得

ここでは、厚生労働省が公開している「令和5年版厚生労働白書 資料編」の「厚生労働全般」のPDFを例に操作手順などを紹介していこう。

まずは、ダウンロードしたPDFを開いて、取得したいデータ表が「文書の何ページ目に掲載されているか?」を確認する。この際に注意すべきポイントは、“ページ番号”ではなく、“何枚目”にデータ表が掲載されているかを確認することだ。

下図に示した例の場合、ページ番号は「10」となっているが、このページはPDF文書の先頭から数えて「7枚目」に位置している。よって、「7」という数字を覚えておく必要がある。

  • 取得するデータ表(7ページ目)

ページを確認できたらExcelを起動し、「データ」タブにある「データの取得」をクリックする。続いて、「ファイルから」→「PDFから」を選択する。

  • 「データ取得」コマンドの操作

読み込むPDFを指定する画面が表示されるので、データの取得元にするPDFを選択し、「インポート」ボタンをクリックする。

  • 取得元になるPDFの指定

PDF文書内にある表が「TableXXX(Page X)」という名称で一覧表示される。先ほど確認した“何枚目”を参考に、データを取得する表を選択する。すると、取得されるデータのプレビューが右側に表示されるので、これを確認してから「データの変換」ボタンをクリックする。

  • 取得するデータ表の選択

「Power Query エディター」が起動し、選択した表からデータが取得される。ただし、必ずしも適切な形でデータが取得されるとは限らない。

  • 「Power Query エディター」に取得されたデータ

このデータを利用していくには、最初にデータ表を“適切な形”に整理してあげる必要がある。

取得したデータ表の整理(1)

ということで、先ほど取得したデータを例に、データ表を整理するときの操作例をいくつか示していこう。

今回の例では、表の“見出し”が2行になっている部分がある。このうち、1行目だけが「列名」として認識され、2行目は「データ」として扱われている。まずは、この部分から修正していこう。

  • 分割されている見出し(不要な行)

今回は、「データ」として扱われてしまっている“見出しの2行目”(カッコ部分)を削除する形でデータ表を整理していこう。表の上部にある“不要な行”を削除するときは、「行の削除」→「上位の行を削除」を選択し、削除する「行数」を指定すればよい。

  • 1行目のデータを削除する処理

続いて、各列の「データ型」を確認する。今回の例では“見出しの2行目”もデータとして扱われていたため、データ型が「テキスト」になっている列が散見される。これらの列に適切なデータ型を指定する。今回の例の場合、数値データに小数点以下の値が含まれているので、各列のデータ型に「10進数」を指定していけばよい。

  • データ型の指定

次は、「年次」の列が2列に分割されている不具合を修正していく。この不具合を解消する方法は大きく分けて2種類ある。

  • 分割されて取得された列

1番目の方法は、分割されてしまった列を「列のマージ」により結合してあげる方法だ。分割されている列を同時選択し、「変換」タブにある「列のマージ」をクリックする。続いて、列の結合方法を指定し、「OK」ボタンをクリックする。

  • 「列のマージ」で処理する場合

これで「年次」の列を1列に戻すことができる。データ取得時に「1990(平成」と「2)」などに分割されていたデータが、「1990(平成2)」という形に結合されているのを確認できるだろう。

  • 列を結合した結果

2番目の方法は「4桁の数字」(西暦)だけを残して、他の部分を削除してしまう方法だ。「年次」の列を選択し、「変換」タブにある「列の分割」→「区切り記号による分割」を選択する。続いて、区切り記号に“(”の文字を指定する。

  • 「列の分割」で処理する場合

“(”の前後で列が2つに分割される。これで「4桁の数字」(西暦)を“単独の列”として扱えるようになる。「年次」は西暦だけでも問題なくデータを読み取れるので、不要になった2つの列を削除する。

  • 不要な列の削除

最後に、列の分割時に自動変更された列名を「年次」に修正すると、データ表の整理が完了する。「閉じて読み込む」のアイコンをクリックして、Excelにデータ表を出力してみよう。

  • 「列名」を修正してデータ表を出力

各列に適切な「表示形式」を指定すると、以下の図に示したようなデータ表(テーブル)を得ることができる。

  • 出力されたテーブル(表示形式を指定)

以上で、PDFからデータを取得する作業は完了となる。若干の修正は必要になるが、PDFを見ながらデータを手入力していく場合と比べると、格段に少ない工数で作業が完了することを確認できるだろう。

取得したデータ表の整理(2)

先ほど示した例のように、PDFからデータを取得する操作そのものは難しいものではない。それよりも、取得したデータを“適切な形”に整理する作業の方が難しいと感じるだろう。

この作業は“表の形式”に応じてケース by ケースになるため、もう一つ例を紹介しておこう。今度は、先ほど示したPDFの“21枚目”にあるデータ表をパワークエリで取得してみよう。

  • 取得するデータ表(21枚目)

今度は、以下の図に示したような形でデータが取得された。データ表の上に記載されている「概要」の文字までデータとして取得されてしまっている。

  • 「Power Query エディター」に取得されたデータ

ひとつずつ順番に整理していこう。表の“見出し”となる部分の大半は、2行目のデータとして取得されている。よって、上から1行のデータを削除し、その後「1行目をヘッダーとして使用」を適用する。

  • 上から1行のデータを削除した後、「1行目をヘッダーとして使用」を適用

これで各列の「列名」を指定できたことになるが、一部、不具合が残っている。取得元のデータ表で“見出し”が少し下に配置されていたり、“見出し”が2行になっていたりしていた部分は、正しい「列名」になっていない。これらの列は、手作業で「列名」を入力しなおす必要がある。

  • 列名を自分で補完

「列名」を正しく修正できたら、上から2行のデータは不要になる。これらの行を削除し、各列に適切な「データ型」を指定する。

以上で、データ表の整理は完了。「年度」のデータが「昭和45」や「46」、「平成元」などになっており、表記が統一されていないことが少し気になるが、これを「Power Query エディター」で修正するのは難しい。よって、現状のままExcelに出力する。

  • 整理したデータ表を出力

各列に適切な「表示形式」を指定すると、以下の図に示したようなデータ表(テーブル)を得ることができる。

  • 出力されたテーブル(表示形式を指定)

ただし、「年度」のデータが“文字列”として扱われており、その表記も統一されていないため、このままでは「並べ替え」などの操作を正しく行えなくなってしまう。この修正はExcelで作業していこう。

新しい列を挿入し、列名に「西暦」と入力する。続いて、「昭和45年」と「昭和46年」に対応する西暦を入力する。その後、これらのセルを選択して、オートフィルで連番の数値をコピーする。

  • 列を挿入し、数値を入力してオートフィルでコピー

「年度」のデータは1年刻みで変化しているので、これで各年度に対応する「西暦」を追加できたことになる。「並べ替え」などの操作も問題なく行えるはずだ。

  • 「年度」の「西暦」を補完したテーブル

このように、すべてを「Power Query エディター」で処理するのではなく、Excelに出力した後に“修正”や“補完”を行うのも効果的な手法といえる。

PDFからのデータ取得は何回も繰り返す作業ではないため、すべてを「Power Query エディター」で処理する必要はない。むしろ、「適当なところまで整理できたら、後はExcelで処理する」と考えた方が効率よく作業を進められるだろう。

普通にコピペした場合は?

最後に、PDFに掲載されているデータ表を普通にコピー&ペーストした例を紹介しておこう。データ表の部分をドラッグして選択し、「Ctrl」+「C」キーを押してデータをコピーする。

  • PDFでデータ表をドラッグしてコピー

その後、Excelを起動して「Ctrl」+「V」キーでデータを貼り付けると、以下の図のような結果になった。

  • Excelに貼り付けた例

この例のように、コピー&ペーストでは正しくデータを取り込めないケースも多い。コピー&ペーストが思った通りに機能してくれるケースもあるが、そうならない場合に備えて、パワークエリでPDFからデータを取得する方法も覚えておくと、いずれ役に立つだろう。