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

imabari.hateblo.jp

cashless.go.jp

https://cashless.go.jp/assets/doc/kameiten_touroku_list.pdf

  • smallpdfは時間がかかりすぎてエラー
  • tabulaもエラー ※500ページごとにすればできました(文字が切れてる)
  • camelotは変換中のまま現在進行中(3時間経過)

市区町村で8文字以上あるところは以下の10件

埼玉県 さいたま市大宮区
埼玉県   さいたま市見沼区
埼玉県   さいたま市中央区
埼玉県   さいたま市浦和区
埼玉県   さいたま市岩槻区
神奈川県    横浜市保土ケ谷区
福岡県   北九州市小倉北区
福岡県   北九州市小倉南区
福岡県   北九州市八幡東区
福岡県   北九州市八幡西区
import csv
import os
import re
import shlex
import subprocess

import requests

# 保存データの種類
save = 1

# ダウンロード
url = 'https://cashless.go.jp/assets/doc/kameiten_touroku_list.pdf'

filename = os.path.basename(url)

r = requests.get(url)

if r.status_code == requests.codes.ok:

    # PDFファイルを保存
    with open(filename, 'wb') as fw:
        fw.write(r.content)

    # コマンド実行
    cmd = 'java -jar pdfbox-app-2.0.16.jar ExtractText -startPage 3 -sort -encoding UTF-8 {}'.format(
        filename)

    args = shlex.split(cmd)
    p = subprocess.Popen(args)

    p.wait()

    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:

                t = line.strip()

                # タイトル確認

                if t.startswith("①固定店舗"):
                    mode = 1

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

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

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

                # 行末に%のみ抽出

                if t.endswith("%"):

                    # 市区町村と事業所名を分離 文字オーバーの場合結合されてしまうため
                    t = re.sub(r'^([\d,]{1,7}) (\S+?) (\S+?市\S+?区)(\S)',
                               r'\1 \2 \3 \4', t)

                    row = t.split()

                    n = len(row)

                    # 保存条件
                    if mode == save:

                        # 固定店舗
                        if mode == 1:

                            if n > 7:
                                tmp = row[0:3] + [' '.join(row[3:-3])
                                                  ] + row[-3:]
                            elif n < 7:
                                continue
                            else:
                                tmp = row

                            writer.writerow(tmp)

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

                            if n > 3:
                                tmp = [row[0]] + [' '.join(row[1:-1])
                                                  ] + [row[-1]]
                            elif n < 3:
                                continue
                            else:
                                tmp = row

                            writer.writerow(tmp)

スプレッドシート

docs.google.com

「ファイル」-「ダウンロード」-「タグ区切りの値」

TSVファイルでダウンロードできます

oku.edu.mie-u.ac.jp

qiita.com

qiita.com

キャッシュレス消費者還元事業の一覧抽出 · GitHub

www.mkamimura.com

gist.github.com

colab.research.google.com