![見出し画像](https://assets.st-note.com/production/uploads/images/44114910/rectangle_large_type_2_6ef7cf81338eed432ab63757174fd825.png?width=800)
『Python・プログラミング』PDFの読み取り・加工・判定ツール!(2)【コラボ企画】
以下記事の続きです!
前回はPDFを読み取ってテキストに書き込み、それをダウンロードする処理までを行いました。今回は要望いただいた判定処理を作っていきます。
前回同様、私の記事は「結果に至るまでの思考」を書きます。結果や簡潔にまとめられた情報だけを見たい方は、「はなこ☆さん」の記事を読んだほうがわかりやすいと思います! 記事投稿は後日行われると思うので、投稿されたらその記事のリンクに変更いたします。
※最後にまとめとして
コード公開と
手順を記載いたします
🌸条件1確認
下記、1~16の項目が記載されているかどうか。
1.化学品及び会社情報
2.危険有害性の要約
3.組成及び成分情報
4.応急措置
5.火災時の措置
6.漏出時の措置
7.取扱い及び保管上の注意
8.ばく露防止及び保護措置
9.物理的及び化学的性質
10.安全性及び反応性
11.有害性情報
12.環境影響情報
13.廃棄上の注意
14.輸送上の注意
15.適用法令
16.その他の情報
まずは、この処理について考えていく。
🌸条件1の処理概要
前回はPDFの情報をテキストに書き込みましたが、「書き込み用の変数」には「1つにまとまったPDFのテキスト情報」が入っています。
ここに条件1の内容が入っているかを判定すればいいはず。
🌸条件1の処理詳細
以下の流れで行う。
条件文字が書かれたテキスト用意
↓
条件文字格納用配列を用意
↓
テキスト読み込み
↓
1行ずつ分けて配列に入れる
↓
判定結果用の配列用意
↓
判定処理 ループ
↓
あったら OK
なかったら NG
処理イメージは以下。
これを行ってヒットしたら「OK」、ヒットなしなら「NG」という結果を配列に格納する。
🌸条件1の実行
コード組めたので実行していきます。
まずは条件文字の準備。
条件文字は以下のようにいたしました。記載がない文字が「NG」になるかのテストも行いたいので、PDFに記載がない「ピーナッツバター」と「かわいい猫ちゃん」を入れました。
▼テキストの中身
化学品及び会社情報
危険有害性の要約
組成及び成分情報
ピーナッツバター
応急措置
火災時の措置
かわいい猫ちゃん
漏出時の措置
取扱い及び保管上の注意
ばく露防止及び保護措置
物理的及び化学的性質
安全性及び反応性
有害性情報
環境影響情報
廃棄上の注意
輸送上の注意
適用法令
その他の情報
これでコードを実行してみると……
ひっかかる可能性がないはずのものが「NG」になってますね。本当にないのか? 見ていきます。いただいたPDFで以下を検索。
安全性及び反応性
ヒットなしですね。PDFの「安全性及び反応性」があるはずの箇所を目で確認します。
安””定”” という記載がありました。ここで考えられるのは
■1
PDFの記載が間違えている
■2
いただいた条件文字が間違えている
事前にいただいたこちらの資料「化管法SDS 標準的な書式」を確認してみます。
どうやら「安定」が正しいようです。こういったことはよくあることです。想定外の挙動が起きた場合は、「入力データ」と「プログラム」どちらが間違えているか両方を確認していきます。
今回は入力データの間違いとわかりました。
訂正して再度実行してみます。
想定どおりになりました。とりあえずこれで良さそうかなと思います。
🌸条件2確認
条件文字1~16が順番通りに並んでいるかどうか。
これについて考えていく。
🌸条件2の処理概要
以下のイメージで作ります。
条件文字の行数を調べる
↓
行数でソート(並び替え)
↓
正しい並びになっているか
ここは色んな方法があるので、もっといい方法もあるかも。
🌸処理詳細・行数分解
PDFのテキスト情報は、現在1つにまとまって入っている。行数を判定するためには、これを1行ごとにわける必要がある。
🌸処理詳細・行数取得
単純に条件文字でテキスト内を1行目からラストまで検索して、何行目にヒットするかを調べるだけでもいいですが、それだと「条件文字が見つかった後の処理」が無駄になります。
PDFのページ数が多いと、見つかった後の検索はめっちゃ無駄になります。なので、ヒットしたらその文字の検索ループ処理を終了させることが必要です。
🌸処理詳細・順番判定
「順番判定結果」を「ヒットした行数」でソート(並び替え)して、「PDFに記載がある順番」と「本来想定している順番」を比較して判定します。
🌸実行・行数取得のみ
PDFは引き続き以下を使用しております。
https://www.asahi-ghs.com/content/files/sample-sds/201909/Ammonia_Gas_J-1.pdf
このPDFは「条件文字の順番」が正しくなっているものです。まずは「行数取得」のプログラムだけを組んだので実行してみると……
おかしい……正しい順番で並んでいるPDFをテストデータとして使ったのに、行数が前の文字よりも先にヒットしている。
🌸原因調査・行数取得
テストに使用した以下PDFで該当文字を検索する。
https://www.asahi-ghs.com/content/files/sample-sds/201909/Ammonia_Gas_J-1.pdf
応急措置
検索を行うと……
ヒット件数が3件あり、最初のここにヒットしていました。本来であれば……
ここが存在するかの判定なので、別の箇所でヒットしていることがわかりました。「有害性情報」についても同様です。
ということは、最初に作った「条件文字が存在しているかの処理」も間違えていたことになります。別のところにヒットして「OK」を出力していた。
🌸修正
確実に目的の文字""のみ""にヒットする必要があります。まずは簡単に解決するため「検索条件文字には統一された記載ルールがあるのか」を「はなこ☆さん」に確認いたしました。
回答は「定義はない」ということでした。以下のようにバラバラになる可能性があるようだ。
11.有害性情報
11.有害性情報
11.有害性情報
1 1 . 有害性情報
プログラム的には嬉しくない表記方法ですね。まずは今回のPDFに対応した処理を完成させて、その後に別形式に対応した処理を考えることにします。
ということで、今回の表示形式はPDFを確認するとこのようになっています。
1.化学品及び会社情報
半角数字 + . + 半角スペース + 文字
これを使うため、テストに使うテキストを以下のように変更いたします。
1. 化学品及び会社情報
2. 危険有害性の要約
3. 組成及び成分情報
ピーナッツバター
4. 応急措置
5. 火災時の措置
かわいい猫ちゃん
6. 漏出時の措置
7. 取扱い及び保管上の注意
8. ばく露防止及び保護措置
9. 物理的及び化学的性質
10. 安定性及び反応性
11. 有害性情報
12. 環境影響情報
13. 廃棄上の注意
14. 輸送上の注意
15. 適用法令
16. その他の情報
🌸再テスト・条件文字有無
テストデータが変わったので再度テストを行います。実行してみると
問題なさそうですね。
🌸実行・行数取得のみ
先程つまづいた箇所を実行してみます。
正しい順番で並んでいるPDFをテストデータとしているので、この結果で問題ないことがわかります。
🌸実行・順番判定
正しい順番で並んでいるPDFでは「NG」がわからないため、順番を変更したデータを使います。
8. ばく露防止及び保護措置を
4. 応急措置の上に移動
6. 漏出時の措置を
5. 火災時の措置の上に移動
これで判定結果処理を実行すると……
間違っていたら、「本来あるべき項目のところに違う項目があるよ」とわかるようになりました。良さそうかな。
現状、出力は結果画面にしておりますが、結果をどう使うか相談して出力形式決めていこうと思います。
あとは、「条件項目の記述形式」がバラバラな問題も次回移行解決していきたいなと思います。まだ考えてないので可能かは不明。
🌸ここから有料
でもほとんど書いてしまったので、コード公開くらいになります。ロジック見てわかる人は買ってもあまり意味ないと思います。
ここから先は
¥ 100
この記事が気に入ったらサポートをしてみませんか?