Excelに吐き出されていたチャット履歴をCosmosDB にインポートしたときのメモ

# はじめに
Excelに吐き出されていたチャット履歴のデータを、生成AIに食べさせてみたりするために一度CosmosDBにまるっとインポートしたときの個人的なメモ

中身のデータがこんな感じのExcelファイルだったので、python使ってJSONに変換して突っ込みました
|ChatID|type|Createdon|MessageText|
|--|--|--|--|
|a0001|user|2024-04-04 13:56:13|○○システムのライセンスを付与していただきたいです|
|a0001|supporter|2024-04-04 14:20:53|こちらの事前の手順を完了させたのち、このチャットでご連絡ください。URL:XXXXXXXX|
|a0001|user|2024-04-05 08:48:59|資料ありがとうございます。|
|a0001|user|2024-04-08 09:45:10|事前の作業完了しました。|
|a0001|supporter|2024-04-08 09:45:10|確認が取れましたので、これからライセンスを付与いたします。|
|a0001|supporter|2024-04-08 10:07:21|ライセンスの付与が完了しました。Welcomeメールが配信されているかと思いますのでそちらからご利用ください|
|a0002|user|2024-04-08 15:29:34|機種変更した際に二要素認証の設定を移すのを忘れました。一度リセットお願いします|
|a0002|supporter|2024-04-08 15:32:26|解除しました。再度登録をお願いします|
|a0002|user|2024-04-08 15:48:07|新しい機種で設定できました。ありがとうございました。|

# CosmosDB のリソース作る
リソースはコアで作ります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261327/7dbdb12d-3871-c67f-b922-671f2232d734.png)


お試しなので、AZは無効、容量はServerlessにして作っておきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261327/fe7838b2-d604-b916-6c1d-8722442d71ec.png)


基本的にデフォルトで作成しますが、バックアップはContinuous (7 days)にしておきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261327/8d1e50f0-4399-1e00-03cb-76a81c31427b.png)

# コンテナを作る
データエクスプローラを起動してコンテナを作っていく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261327/47244a44-56ab-05c5-80e0-4fd0b916aa32.png)

NewContainerから新しくコンテナを作成する（ついでにDBも作る

* Database Id:ChatHistoryDB
* ContainerId：ChatData
* PartitionKey：chatId

あたりを入力してOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261327/52d3bf1c-afa6-3034-2666-a2ad97784fc4.png)

# Excelファイル開いてインポートする関数を作成する
使うライブラリ
```text:requirements.txt
pandas
openpyxl
azure-cosmos
```
データは一連の会話がChatID単位にまとまってるようだったので、この単位にデータを入れていくように今回はしました。
```python:app.py
import pandas as pd
from azure.cosmos import CosmosClient, PartitionKey
import json

# Cosmos DBの接続情報
COSMOS_ENDPOINT = "<your endpoint>"
COSMOS_KEY = "<your Key>"
DATABASE_NAME = "ChatHistoryDB" #作成したDBのID
CONTAINER_NAME = "ChatData"     #作成したコンテナのID
PARTITION_KEY= "/chatId"        #作成したパーティションのキー

# Cosmos DBクライアントの初期化
client = CosmosClient(COSMOS_ENDPOINT, COSMOS_KEY)
database = client.create_database_if_not_exists(id=DATABASE_NAME)
container = database.create_container_if_not_exists(
    id=CONTAINER_NAME,
    partition_key=PartitionKey(path=PARTITION_KEY),
    offer_throughput=400
)

# Excelファイルの読み込み
file_path = r"C:\work\user-chat-history.xlsx"
sheet_name = "Message data"
df = pd.read_excel(file_path, sheet_name=sheet_name)

# データをチャットID単位にグループ化
grouped = df.groupby('chatId')

# グループごとにデータをCosmos DBに格納
# デフォルトでID列ができてしまうので、chatIdと同じ値を入れておく
for chat_id, group in grouped:
    chat_data = {
        "id": chat_id,
        "chatId": chat_id,
        "messages": []
    }
    print(chat_id)
    for index, row in group.iterrows():
        message = {
            "type": row['type'],
            "UserID": row['UserID'],
            "Createdon": row['Createdon'],
            "MessageText": row['MessageText']
        }
        chat_data["messages"].append(message)
    
    # データの挿入
    #idが重複した場合は上書きする
    container.upsert_item(body=chat_data)

print("データのインポートが完了しました。")
```

これでCosmosDBにインポートできた