ホームページ >バックエンド開発 >Python チュートリアル ># | PDF データ抽出を自動化する: ビルド
PDF データ抽出のビジネス ロジックを動作するコードに変換する Python スクリプトを作成しました。
スクリプトは、10 か月間 (2024 年 1 月から 10 月まで) にわたる保管者声明 PDF の 71 ページ でテストされました。 PDF の処理は完了するまでに約 4 秒かかり、手動で行うよりも大幅に速くなりました。
見たところ、出力は正しいように見え、コードにはエラーは発生していません。
3 つの CSV 出力のスナップショットを以下に示します。機密データはグレー表示されていることに注意してください。
スナップショット 1: 株式保有
スナップショット 2: ファンド保有
スナップショット 3: 現金保有
このワークフローは、CSV ファイルを生成するために行った大まかな手順を示しています。
ここで、ビジネス ロジックを Python のコードに変換する方法を詳しく説明します。
pdfplumber の open() 関数を使用しました。
# Open the PDF file with pdfplumber.open(file_path) as pdf:
file_path は、pdfplumber にどのファイルを開くかを指示する宣言された変数です。
extract_tables() 関数は、各ページからすべてのテーブルを抽出するという大変な作業を行います。
私は基礎となるロジックには詳しくありませんが、この関数はかなり良い仕事をしたと思います。たとえば、以下の 2 つのスナップショットは、抽出されたテーブルと元の (PDF からの) テーブルを示しています
スナップショット A: VS Code ターミナルからの出力
スナップショット B: PDF の表
その後、後で特定のテーブルからデータを「選択」できるように、各テーブルに一意のラベルを付ける必要がありました。
理想的なオプションは、各テーブルのタイトルを使用することでした。しかし、タイトルの座標を決定することは私の能力を超えていました。
回避策として、最初の 3 つの列のヘッダーを連結して各テーブルを識別しました。たとえば、スナップショット B の 株式保有 テーブルには、Stocks/ETFsnNameExchangeQuantity.
というラベルが付いています。⚠️このアプローチには重大な欠点があります。最初の 3 つのヘッダー名ではすべてのテーブルが一意になるわけではありません。幸いなことに、これは無関係なテーブルにのみ影響します。
私が必要とした特定の値 (口座番号と明細書日付) は、各 PDF のページ 1 の部分文字列でした。
たとえば、「口座番号 M1234567」には口座番号「M1234567」が含まれます。
私は Python の re ライブラリを使用し、ChatGPT に適切な正規表現 (「regex」) を提案してもらいました。正規表現は各文字列を 2 つのグループに分割し、2 番目のグループに必要なデータを入れます。
明細書日付および口座番号文字列の正規表現
# Open the PDF file with pdfplumber.open(file_path) as pdf:
次に、明細書日付を「yyyymmdd」形式に変換しました。これにより、データのクエリと並べ替えが簡単になります。
regex_date=r'Statement for \b([A-Za-z]{3}-\d{4})\b' regex_acc_no=r'Account Number ([A-Za-z]\d{7})'
match_date は、正規表現に一致する文字列が見つかったときに宣言される変数です。
関連するデータポイントの抽出という難しい作業は、この時点でほぼ完了しました。
次に、pandas の DataFrame() 関数を使用して、ステップ 2 と ステップ 3 の出力に基づいて表形式のデータを作成しました。また、この関数を使用して不要な列と行を削除しました。
最終結果は、CSV に簡単に書き込んだり、データベースに保存したりできます。
Python の write_to_csv() 関数を使用して、各データフレームを CSV ファイルに書き込みました。
if match_date: # Convert string to a mmm-yyyy date date_obj=datetime.strptime(match_date.group(1),"%b-%Y") # Get last day of the month last_day=calendar.monthrange(date_obj.year,date_obj.month[1] # Replace day with last day of month last_day_of_month=date_obj.replace(day=last_day) statement_date=last_day_of_month.strftime("%Y%m%d")
df_cash_selected は現金保有データフレームであり、file_cash_holdings は現金保有 CSV のファイル名です。
➡️ データベースのノウハウを習得したら、適切なデータベースにデータを書き込みます。
カストディアンステートメント PDF から表とテキストデータを抽出するための作業スクリプトが用意されました。
先に進む前に、いくつかのテストを実行して、スクリプトが期待どおりに動作するかどうかを確認します。
--終了
以上が# | PDF データ抽出を自動化する: ビルドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。