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

## 初めに

後輩の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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3335050/67767a34-69eb-76f7-f574-3ef99a244113.png)

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

### 3. ChatGPT

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3335050/a5e5ce45-889a-ce24-1c84-6f6491aa217d.png)

## 実装内容

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

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

```python
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)
```

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

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

```python
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")

```

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

```python
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の結果とかは普通に誤ったことがありますが、仕事のヒントを色々提供してくれる助手ですので、今後もどんどん使っていきたいと思います。