以下の3つのファイルを1つのJSONデータにするPythonプログラムをChatGPTに作成してもらいました。
mail-src,mail-subject aaa@yyy.com,"test ay1" aaa@yyy.com,"test ay2" aaa@zzz.com,"test az1" bbb@yyy.com,"test by1" bbb@zzz.com,"test bz1" ccc@yyy.com,"test cy1" ccc@zzz.com,"test cz1" uid,mail-src user-a,"aaa@yyy.com,aaa@zzz.com" user-b,"bbb@yyy.com,bbb@zzz.com" user-c,"ccc@yyy.com,ccc@zzz.com" dest,state,category,black,pc,uid,mail https://aaa.com:9001/aaa,pass,phishing,no,pc-a,user-a,aaa@xxx.com https://bbb.com:9001/bbb,block,c2,yes,pc-b,user-b,bbb@xxx.com https://ccc.com:9001/ccc,pass,c2,yes,pc-c,user-c,ccc@xxx.com
出来上がりのJSONイメージは以下の通りです。
[
{
"dest": "https://aaa.com:9001/aaa",
"state": "pass",
"category": "phishing",
"black": "no",
"pc": "pc-a",
"uid": "user-a",
"mail": "aaa@xxx.com",
"mail-src": {
"aaa@yyy.com": [
"test ay1",
"test ay2"
],
"aaa@zzz.com": [
"test az1"
]
}
},
{
"dest": "https://bbb.com:9001/bbb",
"state": "block",
"category": "c2",
"black": "yes",
"pc": "pc-b",
"uid": "user-b",
"mail": "bbb@xxx.com",
"mail-src": {
"bbb@yyy.com": [
"test by1"
],
"bbb@zzz.com": [
"test bz1"
]
}
},
{
"dest": "https://ccc.com:9001/ccc",
"state": "pass",
"category": "c2",
"black": "yes",
"pc": "pc-c",
"uid": "user-c",
"mail": "ccc@xxx.com",
"mail-src": {
"ccc@yyy.com": [
"test cy1"
],
"ccc@zzz.com": [
"test cz1"
]
}
}
]
そして実際にChatGPTに作成してもらった Pythonプログラムは以下の通りです。(すこし自分の環境に合わせて修正はしていますが。)
import csv
import json
# CSVファイルを読み込み、データを取得
#
# 最初の部分では、mail_src.csv、mail_data.csv、url_data.csv という
# 3つのファイルをそれぞれ辞書形式に読み込みます。
# これにより、各ファイルのデータが辞書のリストとして取得されます。
# それぞれの辞書内には、CSVのヘッダーがキーとして使用され、
# 各行のデータがそれぞれの辞書として格納されます。
with open('mail_src.csv', 'r') as file:
mail_src_data = list(csv.DictReader(file))
with open('mail_data.csv', 'r') as file:
uid_data = list(csv.DictReader(file))
with open('url_data.csv', 'r') as file:
dest_data = list(csv.DictReader(file))
# メールアドレスと件名をマッピングする辞書を作成
#
# mail_src.csv ファイルの内容から、メールアドレスと件名のマッピングを
# 作成します。mail_subject_map という辞書を作成し、
# メールアドレスをキーにして、それに関連する件名をリストとして格納します。
mail_subject_map = {}
for entry in mail_src_data:
mail = entry['mail-src']
subject = entry['subject'].replace('\u201d', '').replace('\"', '')
if mail in mail_subject_map:
mail_subject_map[mail].append(subject)
else:
mail_subject_map[mail] = [subject]
# JSONデータを構築
#
# dest_data の情報を元にして新しい JSON データを構築します。
# 各行の情報を元に、dest_entry という辞書を作成し、'dest'、'state'、
# 'category'、'black'、'pc'、'uid'、'mail'というキーを持たせます。
json_data = []
for entry in dest_data:
uid = entry['uid']
mail = entry['mail']
dest_entry = {
'dest': entry['dest'],
'state': entry['state'],
'category': entry['category'],
'black': entry['black'],
'pc': entry['pc'],
'uid': uid,
'mail': mail,
'mail-src': {}
}
# mail-src内のデータを整形
#
# 'mail-src' キーに関連する情報を整形します。
# これは、mail_data.csv と mail_src.csv の情報を組み合わせ、
# 指定された形式で'mail-src' キーの中身を構築するための処理です。
if uid in [row['uid'] for row in uid_data]:
mail_src = [x.strip() for x in next(row['mail-src'] for row in uid_data if row['uid'] == uid).split(',')]
for src in mail_src:
if src in mail_subject_map:
dest_entry['mail-src'][src] = mail_subject_map[src]
json_data.append(dest_entry)
# JSON形式に変換して出力
#
# json.dumps() を使用して json_output に JSON 形式のデータを出力します。
# これにより、json_output には指定された形式の JSON データが格納されます。
# そして、print(json_output) により、この JSON データが出力されます。
json_output = json.dumps(json_data, indent=2)
print(json_output)
人間が作るとなるとPythonに詳しい人でも数時間はかかりそうですが、ChatGPT は一瞬で作ってしまうところがすごいですね。
また、私はPython初心者なので、見たことないような関数を使われていると勉強になります。

