教会エンジニアの開発日記

Webアプリの開発を生業としたクリスチャンです。

大量のwordをpythonで自動化してデータベースに変換してみた

 

こんにちは。

教会エンジニアのSatoruです。

 

今回は教会でのDX事例を紹介します。

 

 

開発までの経緯

まず前提として知っておいてほしいのですが、

神様が話される言葉を「御言葉(みことば)」と言います。

 

この御言葉、つまりは聖句や箴言などをまとめておくのにwordを使っていました。

それを以前開発した情報集約サイトにアップしたいとのことでした。

 

そしたらWeb上でみんながその御言葉を読めたりするのでかなり便利です。

これをどうにかしてできないかという相談がありました。

依頼主は「それが技術的に難しいならもういっそのこと全部コピペして頑張るよ!」という恐ろしいやる気の持ち主でした。wordファイルは2000を超えていたのです。

それは技術者として絶対にさせまいとコードを書くに至りました。

 

もう少し具体的にはタイトルの通り、「2000を超えるwordファイルを自動的に読み取って情報集約サイトのデータベースに挿入する」ようになりました。

 

 

開発中に起きた課題

こういったファイル操作系は自分はpythonで書くことが多いのでpythonでwordを開いて中身を取得できるようなライブラリを探してきます。

 

ありました、ありました。その名も「python-docx

これを使ってファイルをひたすら読み込んでいき、SQLのコードを出力していきます。

 

課題1: m1でpython-docxが動かない

そして早速課題発生。

なんとpython-docxがMacのm1では動きませんでした。どういうことやら。

$ python main.py
Traceback (most recent call last):
  File "main.py", line 1, in <module>
    import docx
  File "/Users/shimonosatoru/.pyenv/versions/3.8.10/lib/python3.8/site-packages/docx/__init__.py", line 3, in <module>
    from docx.api import Document  # noqa
  File "/Users/shimonosatoru/.pyenv/versions/3.8.10/lib/python3.8/site-packages/docx/api.py", line 14, in <module>
    from docx.package import Package
  File "/Users/shimonosatoru/.pyenv/versions/3.8.10/lib/python3.8/site-packages/docx/package.py", line 9, in <module>
    from docx.opc.package import OpcPackage
  File "/Users/shimonosatoru/.pyenv/versions/3.8.10/lib/python3.8/site-packages/docx/opc/package.py", line 9, in <module>
    from docx.opc.part import PartFactory
  File "/Users/shimonosatoru/.pyenv/versions/3.8.10/lib/python3.8/site-packages/docx/opc/part.py", line 12, in <module>
    from .oxml import serialize_part_xml
  File "/Users/shimonosatoru/.pyenv/versions/3.8.10/lib/python3.8/site-packages/docx/opc/oxml.py", line 12, in <module>
    from lxml import etree
ImportError: dlopen(/Users/shimonosatoru/.pyenv/versions/3.8.10/lib/python3.8/site-packages/lxml/etree.cpython-38-darwin.so, 2): no suitable image found.  Did find:
    /Users/shimonosatoru/.pyenv/versions/3.8.10/lib/python3.8/site-packages/lxml/etree.cpython-38-darwin.so: mach-o, but wrong architecture
    /Users/shimonosatoru/.pyenv/versions/3.8.10/lib/python3.8/site-packages/lxml/etree.cpython-38-darwin.so: mach-o, but wrong architecture

m1でも動かせるようなやり方はないのかいろいろ模索するも

結局面倒になって友人からintel製のCPUが搭載されたMacを借りました。
(dockerだといけたんかな)

 

やはり持つべきものはintel Mac 友人ですね。

課題2: wordファイルが古い

今度はwordが古いと怒られます。

公式ドキュメントにもこのような記載があります。

.doc files from Word 2003 and earlier won’t work

Working with Documents — python-docx 0.8.11 documentation

 

これに関しては下記の記事を参考にしました。

qiita.com

 

記事の内容通り、antiwordとdocx2txtを使うことで解決です。

この記事にはだいぶ助けられました😇

 

記事中のget_doc_text()なんかは丸パクリさせていただきました。

 

課題3: タイトルの日付の形式がバラバラ&変な文字入ってる

タイトルに変な文字とかスペースとか入ってるものがあり、「そんなファイルないよ」と読み込みエラーが発生しているファイルがありました。

これはそんなにファイル数が多くなかったので検索して洗い出してから一つ一つ手で直しました。


また、日付のフォーマットもバラバラでした。
例えば20190401というファイルがあると思いきや、190401だったり、19401、0401というのもありました。

まぁファイル名が日付で統一されていたのは不幸中の幸いでした。

 

こちらに関してはファイル名の一覧をテキストファイルで作成し、テキストをエディタで開いて、ファイル名を正規表現で抜き出し、そのフォーマットどおりに修正することで解決しました。

正規表現便利〜

 

僕はちなみにこの正規表現を使って180人日かかる仕事を4人日で終わらせたことがあります笑
正規表現恐るべし。

 

もう一度流れをおさらいしておくと、

  1. wordファイルの中身をpython-docxで読み取る
  2. それらをSQLの形に変換してtxtファイルに出力する
  3. 出力したSQLを情報集約サイトのデータベース上で実行する

といった感じです。

 

結果

このようにして無事wordファイルをすべてDBに取り込むことができました。今回はwordからSQLに変換するというものでしたが、エクセルやテキストなどをまた別のファイルや形式に直すのは一つの規則が通用すればできます。

 

日本でもデジタル庁が作られ、国の膨大なデータをデータベース化していくとなるとこういった作業が発生してくると思いますし、もっと複雑で怪奇だと思います。巷ではオープンデータの活用という話も出ていますが、結局使えないデータだったら意味ないですからね。

応用できてこそデータです。

 

 

ちょっと話逸れましたが、以上になります。

最後まで読んでいただきありがとうございました。

 

もしいいなと感じていただけたらTwitterなんかもやってますので、ぜひフォロー、リツイート、いいねしてもらえると嬉しいです!

twitter.com