Googleレンズと連携したレシート管理のプロトタイプ(その3)

プログラミング

Accessデータベースに保存しているデータをMySQLデータベースにデータ移行しましたので、その方法を紹介します。

この処理はプロトタイプというよりも、本番作業になります。


手順は、次の通りです。

  1. AccessでテーブルをCSVファイルにエクスポートする
  2. CSVファイルの文字コードをシフトJISからUTF8にメモ帳を使って変更する
  3. Pythonの移行プログラムでCSVファイルのデータをMySQLデータベースへ出力する

1. AccessでテーブルをCSVファイルにエクスポートする

Accessを起動し、レシートのデータベースを選択します。
テーブル一覧の「レシート」テーブルを右クリック➡[エクスポート]➡[テキストファイル]の順にクリックします。

続いて表示される画面に、CSVファイルの出力先とファイル名を入力します。

「区切り記号付き-コンマやタブなどでフィールドが区切られている」が選択されていることを確認します。(デフォルト)
当画面の[設定]ボタンについて補足しておきます。
[設定]をクリックすると「エクスポート定義」画面が表示され、当画面の[コードページ]が「日本語(シフトJIS)」になっているはずです。(デフォルトなので設定をかえていなければ)
ここで、UTF8に変更することができますが、UTF8に変更すると、「¥」文字が文字化けを起こすようです。
MySQLの文字コードがUTF8なので、ここで変更したところ、「\280]など単価情報の「\」が文字化けを起こし、Pythonプログラム実行時、\記号を除外するコードでエラーが発生しました。
なので、デフォルトの「日本語(シフトJIS)」でエクスポートを進め、エクスポート完了後メモ帳を使って、UTF8を指定して保存し直します。

なお、MySQLの文字コードは、MySQLのコマンドラインから次のコマンドを実行すると、確認することができます。
show variables like “chara%”;

エクスポートの完了画面が表示されたら[閉じる]ボタンをクリックします。

デスクトップ上にエクスポートファイルが作成されます。

なお、私の場合、ActiveXのセキュリティポリシーの設定のため、CSVファイルへの出力ができませんでした。
Accessの[ファイル]➡[オプション]➡[トラストセンター]➡[トラストセンターの設定]➡[ActiveXの設定]で下図のように変更したら、エクスポートすることができました。

2. CSVファイルの文字コードをシフトJISからUTF8にメモ帳を使って変更する

receipt.csvファイルを開き、[名前を付けて保存]で文字コードを「UTF-8」にして保存し直してください。(同じファイル名で上書き保存します)

3. 移行プログラムでCSVファイルのデータをMySQLデータベースへ出力する

Jupyuter Notebookで移行プログラムを実行します。
MySQLにデータが移行されていることを確認します。

最後に移行プログラムのPythonコードを載せておきます。

import csv
import mysql.connector


#
# CSVファイルのパス名ファイル名を設定
#
csv_file_path = 'C:/Users/user1/Desktop/レシート.csv'

########################################################
# データベースに接続する処理
########################################################
def create_db_connection(host_name, user_name, user_password, db_name):
    connection = None
    try:
        connection = mysql.connector.connect(
            host=host_name,
            user=user_name,
            passwd=user_password,
            database=db_name
        )
    except mysql.connector.Error as err:
        print(f"Error: '{err}'")

    return connection


########################################################
# CSVファイルのデータをデータベーステーブルに出力する処理
########################################################
if __name__ == "__main__":
    host = "localhost"
    user = "root"
    password = "root"
    database = "receipt"
    # データベースに接続
    db_connection = create_db_connection(host, user, password, database)
    if db_connection:
        cursor = db_connection.cursor()

        # CSVファイルからデータを読み込んでreceiptテーブルに挿入
        with open(csv_file_path, 'r', encoding='utf-8') as csvfile:
            csv_reader = csv.reader(csvfile)

            for row in csv_reader:
                id, purchasedate, kamokucode, zeikubun, itemname, price, quantity, amount, shop, paymentcode = row
                price = float(price.replace('\\', '').replace(',', ''))  # \とカンマを除去して数値に変換
                quantity = int(quantity)
                amount = price * quantity

                insert_sql = """
                INSERT INTO receipt (purchasedate, shop, itemname, price, quantity, amount, kamokucode, zeikubun, paymentcode)
                VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s);
                """
                try:
                    cursor.execute(
                        insert_sql,
                        (
                            purchasedate,
                            shop,
                            itemname,
                            price,
                            quantity,
                            amount,
                            kamokucode,
                            zeikubun,
                            paymentcode
                        )
                    )

                # insert文を実行
                except mysql.connector.Error as err:
                    print(f"Error: '{err}'")

            # コミットして接続を閉じる
            db_connection.commit()
            cursor.close()
            db_connection.close()

            print('データの挿入が完了しました!')

前へ Googleレンズと連携したレシート管理のプロトタイプ(その2)

タイトルとURLをコピーしました