3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「Develop fun!」を体現する! Works Human IntelligenceAdvent Calendar 2024

Day 24

生成AIを使ってCSVをチェックするpythonツールを簡単に作れた

Last updated at Posted at 2024-12-24

初めに

後輩のPRをチェックする役割になりました。
普通に目で見ればいい内容が多いのですが、CSVの中、既存のレコードをコピーしてちょっと修正するところがたくさんありました。(30行ぐらい)
GSSとかを使って作ってくれましたので大丈夫と思ったのですが、やはりソースベースでの確認をしたく、
簡単なpythonツールを作りました。

実装の小ネタ

まず、今回の実装で役になったツールとかを少し紹介します。

1. Vscode

Vscodeの拡張機能Pythonを使えば、pythonコードの実行は簡単にできます。
以前同じことをやっていますので、今回も同様なことをやっています。

後、拡張機能を使うのにpythonのインストールが必要です。
https://www.python.org/downloads/

2. Github Copilot

自分は少し書いたレベルでがっつり1から書いた経験はあまりありません。
最近生成AIが登場し、それを使ってかなり早いスピードで書けますのでお勧めです。

Github CopilotはVscodeの拡張機能からも利用できます。
コメントとかを書けば、tabキーもしくはenterを押すと、実装が提案されるようにされます。
さらにtabキーを押して実装を受け入れることができます。
以下のイメージです。

image.png

生成AIなので100%正解になるのは不可能ですが、コメントの精度が高ければ、書いてくれたソースの精度も上がります。
後は実際にデバッグしてバグを直していくというイメージです。

3. ChatGPT

社内ツールのWeisehubはChatGPTが搭載されていますので、実装の質問についてまずそこに聞いています。

その他、当時は使えなかったのですが、Github Copilot Chatもあるのを最近知りました。質問しながらソースを書くことなどいろんなことができるようです。
ctrl + shift + iのショートカットキーでchatが開けます。
ChatGPTと併用していきたいと思います。

image.png

実装内容

比較する行のリストを取得する

id_file_pathは今回修正したファイルのidが保持されているファイルになります。
csv_fileは今回チェックしたいファイルです。
どの行を参照してコピーしているか、該当行の行番号を取得し、[修正前番号,修正後番号]([[1, 11], [2, 12]])のような配列に配置しています。
実装は以下の通りです。

def get_relative_rows(id_file_path, csv_file_path):
    with open(id_file_path, 'r') as file:
        lines = file.readlines()  # idのリスト
        print(lines)

        relative_rows_list = []
        with open(csv_file_path, 'r') as csv_file:
            reader = csv.reader(csv_file)
            rows = list(reader)
            for line in lines:
                relative_rows = []
                id = line.strip()
                for i, row in enumerate(rows):
                    if id in row[0]:
                        relative_rows.append(i)
                relative_rows_list.append(relative_rows)

修正前後の差分を比較する

修正前後の結果を比較し、結果ファイルに書き込んでいます。

def compare_columns(csv_file_path, relative_rows, column_indices):
    with open(csv_file_path, 'r') as file:
        reader = csv.reader(file)
        rows = list(reader)

        for relative_row in relative_rows:
            row_before_index = relative_row[0]  # 修正元の行番号
            row_after_index = relative_row[1]  # 修正先の行番号

            for column_index in column_indices:  # 比較する列を指定
                bef = rows[row_before_index][column_index]
                aft = rows[row_after_index][column_index]

                if bef_new != aft_new:
                    # 比較の結果をファイルに書き込む
                    with open(result_file, "a") as f:
                        print(f"{row_before_index+1}と行{row_after_index+1}{column_index}列が異なります")
                        f.write(f"{row_before_index+1}と行{row_after_index+1}{column_index}列が異なります\n")
                        f.write(f"{bef_new}\n")
                        f.write(f"{aft_new}\n\n")

最終的に処理を実行します。

column_indices = [] # カラム番号の配列、[1,2,3,4...]の形式
csv_file_path = "" # 確認したいCSVファイルのパス

# 修正前後比較結果ファイルをクリアする
with open(result_file, "w") as f:
    pass

# 比較する相対行のリスト
relative_rows_list = get_relative_rows(id_file_path, csv_file_path)

# 行間を比較する
compare_columns(csv_file_path, relative_rows_list, column_indices)

他にも実装した内容がありますが業務関連で割愛します。

最後に

凄く簡単なツールですが、生成AI関連のツールを使って結構早く実装できてよかったと思います。
生成AIを使えば、pythonのあまり書けない人も書けるようになると思います。
生成AIの結果とかは普通に誤ったことがありますが、仕事のヒントを色々提供してくれる助手ですので、今後もどんどん使っていきたいと思います。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?