初めに
後輩の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キーを押して実装を受け入れることができます。
以下のイメージです。
生成AIなので100%正解になるのは不可能ですが、コメントの精度が高ければ、書いてくれたソースの精度も上がります。
後は実際にデバッグしてバグを直していくというイメージです。
3. ChatGPT
社内ツールのWeisehubはChatGPTが搭載されていますので、実装の質問についてまずそこに聞いています。
その他、当時は使えなかったのですが、Github Copilot Chatもあるのを最近知りました。質問しながらソースを書くことなどいろんなことができるようです。
ctrl + shift + i
のショートカットキーでchatが開けます。
ChatGPTと併用していきたいと思います。
実装内容
比較する行のリストを取得する
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の結果とかは普通に誤ったことがありますが、仕事のヒントを色々提供してくれる助手ですので、今後もどんどん使っていきたいと思います。