キャッシュレス・消費者還元事業事務局審査を通過した加盟店一覧をPDFをCSV変換2

imabari.hateblo.jp

正規表現での抽出を参考にColaboratoryで実行

!apt-get install openjdk-11-jre
!curl -OL https://www-eu.apache.org/dist/pdfbox/2.0.16/pdfbox-app-2.0.16.jar
!curl -OL https://cashless.go.jp/assets/doc/kameiten_touroku_list.pdf
!java -jar pdfbox-app-2.0.16.jar ExtractText -startPage 3 -sort -encoding UTF-8 kameiten_touroku_list.pdf
  • 9月6日用にタイトル修正
  • ブラウザが固まってしまってスプレッドシートに貼り付けできない
import csv
import re


# 保存データの種類
save = [1, 2, 3, 4]

with open('result.tsv', 'w', encoding="utf-8") as fw:
    writer = csv.writer(fw, dialect=csv.excel_tab, lineterminator='\n')

    with open('kameiten_touroku_list.txt', mode='rt',
              encoding="utf-8") as fr:

        mode = 0

        for line in fr:

            line = line.strip()

            # タイトル確認

            if line.startswith("②固定店舗"):
                mode = 1

            elif line.startswith("③EC・通信販売(楽天市場)"):
                mode = 2

            elif line.startswith("④EC・通信販売(Yahoo!ショッピング)"):
                mode = 3

            elif line.startswith("⑤EC・通信販売(その他ECサイト)"):
                mode = 4

            # 行末に%のみ抽出

            if line.endswith("%"):

                # 市区町村と事業所名を分離 文字オーバーの場合結合されてしまうため
                # line = re.sub(r'(埼玉県 さいたま市(大宮|見沼|中央|浦和|岩槻)区)(?! )', r'\1 ', line)
                # line = re.sub(r'(神奈川県 横浜市保土ケ谷区)(?! )', r'\1 ', line)
                # line = re.sub(r'(福岡県 北九州市(小倉北|小倉南|八幡東|八幡西)区)(?! )', r'\1 ', line)


                # 保存条件
                if mode in save:

                    # 固定店舗
                    if mode == 1:

                        regexp = r"([\d,]+) ([^ ]+) ([^ ]+) (.+) ([^ ]+) ([^ ]+) (\d+%)$"
                        m = re.search(regexp, line)
                        
                        if m:
                            writer.writerow(m.groups())
                        else:
                            print(line)

                    # EC・通信販売
                    elif mode in [2, 3, 4]:

                        regexp = r"([\d,]+) (.+) (\d+%)$"
                        m = re.search(regexp, line)
                        
                        if m:
                            writer.writerow(m.groups())
                        else:
                            print(line)
import csv
import re

regxp1 = re.compile(
    r"(^\d{1,3}(,\d{3})?)\s(\S{2,3}(都|道|府|県))\s+(\S{1,7}(市|区|町|村))\s+(.+)\s+(\S+)\s+(\S+)\s+([2|5]%)$"
)
regxp2 = re.compile(r"(^\d{1,3}(,\d{3})?)\s+(.+)\s+([2|5]%)$")

# 保存データの種類
save = [1, 2, 3, 4]

with open('result.tsv', 'w', encoding="utf-8") as fw:
    writer = csv.writer(fw, dialect=csv.excel_tab, lineterminator='\n')

    with open('0905_kameiten_touroku_list.txt', mode='rt', encoding="utf-8") as fr:

        mode = 0

        for cnt, line in enumerate(fr, 1):

            line = line.strip()

            # タイトル確認

            if line.startswith("②固定店舗"):
                mode = 1

            elif line.startswith("③EC・通信販売(楽天市場)"):
                mode = 2

            elif line.startswith("④EC・通信販売(Yahoo!ショッピング)"):
                mode = 3

            elif line.startswith("⑤EC・通信販売(その他ECサイト)"):
                mode = 4

            # 行末に%のみ抽出

            if line.endswith("%"):

                # 保存条件
                if mode in save:

                    # 固定店舗
                    if mode == 1:

                        m = regxp1.search(line)

                        if m:
                            writer.writerow(
                                [m[i].strip() for i in [1, 3, 5, 7, 8, 9, 10]])
                        else:
                            print(cnt, line)

                    # EC・通信販売
                    elif mode in [2, 3, 4]:

                        m = regxp2.search(line)

                        if m:
                            writer.writerow([m[i].strip() for i in [1, 3, 4]])
                        else:
                            print(cnt, line)