ホームページ >バックエンド開発 >Python チュートリアル ># | PDF データ抽出を自動化する: ビルド

# | PDF データ抽出を自動化する: ビルド

Barbara Streisand
Barbara Streisandオリジナル
2024-12-15 11:06:11646ブラウズ

概要

PDF データ抽出のビジネス ロジックを動作するコードに変換する Python スクリプトを作成しました。

スクリプトは、10 か月間 (2024 年 1 月から 10 月まで) にわたる保管者声明 PDF の 71 ページ でテストされました。 PDF の処理は完了するまでに約 4 秒かかり、手動で行うよりも大幅に速くなりました。

# | Automate PDF data extraction: Build

見たところ、出力は正しいように見え、コードにはエラーは発生していません。

3 つの CSV 出力のスナップショットを以下に示します。機密データはグレー表示されていることに注意してください。

スナップショット 1: 株式保有

# | Automate PDF data extraction: Build

スナップショット 2: ファンド保有

# | Automate PDF data extraction: Build

スナップショット 3: 現金保有

# | Automate PDF data extraction: Build

このワークフローは、CSV ファイルを生成するために行った大まかな手順を示しています。

# | Automate PDF data extraction: Build

ここで、ビジネス ロジックを Python のコードに変換する方法を詳しく説明します。

ステップ 1: PDF ドキュメントを読む

pdfplumber の open() 関数を使用しました。

# Open the PDF file
with pdfplumber.open(file_path) as pdf:

file_path は、pdfplumber にどのファイルを開くかを指示する宣言された変数です。

ステップ 2.0: 各ページからテーブルを抽出およびフィルタリングする

extract_tables() 関数は、各ページからすべてのテーブルを抽出するという大変な作業を行います。

私は基礎となるロジックには詳しくありませんが、この関数はかなり良い仕事をしたと思います。たとえば、以下の 2 つのスナップショットは、抽出されたテーブルと元の (PDF からの) テーブルを示しています

スナップショット A: VS Code ターミナルからの出力

# | Automate PDF data extraction: Build

スナップショット B: PDF の表

# | Automate PDF data extraction: Build

その後、後で特定のテーブルからデータを「選択」できるように、各テーブルに一意のラベルを付ける必要がありました。

理想的なオプションは、各テーブルのタイトルを使用することでした。しかし、タイトルの座標を決定することは私の能力を超えていました。

回避策として、最初の 3 つの列のヘッダーを連結して各テーブルを識別しました。たとえば、スナップショット B株式保有 テーブルには、Stocks/ETFsnNameExchangeQuantity.

というラベルが付いています。

⚠️このアプローチには重大な欠点があります。最初の 3 つのヘッダー名ではすべてのテーブルが一意になるわけではありません。幸いなことに、これは無関係なテーブルにのみ影響します。

ステップ 2.1: 表以外のテキストを抽出、フィルター、変換する

私が必要とした特定の値 (口座番号と明細書日付) は、各 PDF のページ 1 の部分文字列でした。

たとえば、「口座番号 M1234567」には口座番号「M1234567」が含まれます。

# | Automate PDF data extraction: Build

私は 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 は、正規表現に一致する文字列が見つかったときに宣言される変数です。

ステップ 3: 表形式のデータを作成する

関連するデータポイントの抽出という難しい作業は、この時点でほぼ完了しました。

次に、pandas の DataFrame() 関数を使用して、ステップ 2ステップ 3 の出力に基づいて表形式のデータを作成しました。また、この関数を使用して不要な列と行を削除しました。

最終結果は、CSV に簡単に書き込んだり、データベースに保存したりできます。

ステップ 4: データを 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。