タイトル:りあ キャラクター名:りあ 種族:フィー [特徴:妖精の加護、浮遊] 生まれ:剣の舞手 ■パーソナルデータ・経歴■ 年齢:14 性別:女 髪の色:ピンク / 瞳の色:赤  / 肌の色:白 身長:142cm 体重:32kg 経歴1: 経歴2: 経歴3: 穢れ度:0 ■能力値■      技     体     心 基礎    8      9     11    器用 敏捷 筋力 生命 知力 精神 A~F  12  17   6   6   6   9 成長  81  78  41  39  16  16 →計:271 修正   6   6            1 =合計= 109  111  58  54  33  37 ボーナス  18  18   9   9   5   6    生命 精神    抵抗 抵抗  HP  MP 基本  25  22  102  79 特技         0   0 修正 =合計= 25  22  102  79 ■レベル・技能■ 冒険者レベル:16 Lv フェアリーテイマー 14 Lv  / スカウト   9 Lv レンジャー     9 Lv  /  エンハンサー 13 Lv アルケミスト    5 Lv  /  ミスティック 2 Lv バトルダンサー   16 Lv  /         Lv ■戦闘特技・値■ [参照]  特技名      : 効果                                 : 前提 [p]            :                                    : [pIB34] ルーンマスター   : 魔法拡大を宣言せずに使用出来る                    : 魔法技能1つのLv11 [p3143] バトルマスター   : 宣言の必要な戦闘特技を最大2つ同時に宣言できるようになる       : ファイターorグラップラーLv13 [p2120] トレジャーハント  : 戦利品のロールに+1                          : スカウトLv.5 [p2123] ファストアクション : 戦闘の第1ラウンドで先手なら、主動作を2回行える            : スカウトLv.7 [p2120] 影走り       : 乱戦エリアの脇を通り抜けるとき、乱戦を宣言されない          : スカウトLv.9 [p2122] 治癒適性      : Hpが回復する効果を受けるとき、その効果に自分だけ+1          : レンジャーLv.5 [p2123] 不屈        : HPが0以下になっても気絶しない                     : レンジャーLv.7 [p2123] ポーションマスター : ポーションを1R1本補助動作で飲める                   : レンジャーLv.9 [p1-286]牽制攻撃      : 次の攻撃1回(範囲攻撃ならその全て)の命中力+3            : [p1-281]武器習熟A/フレイル : ダメージ+1、Aランク装備可能                      : [p2-228]スローイング    : 投擲武器の命中+1、射程10mだった投擲の射程が20mになる         : [p1-282]防具習熟A/非金属鎧 : 防護点+1、Aランク装備可能                       : [p2-231]練体の極意     : 練技の効果時間が3倍になるが、効果時間が一瞬のものは変わらない     : [p3-212]武器の達人     : 全ての武器を装備できる                        : [p1-281]武器習熟S/フレイル : さらにダメージ+2、Sランク装備可能                   : [p1-288]必殺攻撃      : 次の1回の近接攻撃のダメージの出目+1、C後も継続+クリ無効やC値増加無視 : [p1-292]マルチアクション  : 制限移動を条件に、近接攻撃と魔法を両方行使できる           : [p1-282]防具習熟S/非金属鎧 : さらに防護点+2、Sランク装備可能                    : [p1-279]回避行動      : 回避力+2                               : [p]            : アボイドステップ(オリジナル)                    :    魔物       全力    知識 先制 移動 移動 基本   0  27 111  333 修正 特技        0 =合計=  0  27 111m 333m ■呪歌・練技・騎芸・賦術・鼓咆・占瞳■ [参照] 特技名        : 効果: 前提 [p]  ストロングブラッド   :   : [p]  キャッツアイ      :   : [p]  ガゼルフット      :   : [p]  メディテーション    :   : [p]  ジャイアントアーム   :   : [p]  ケンタウロスレッグ   :   : [p]  スフィンクスノレッジ  :   : [p]  デーモンフィンガー   :   : [p]  リカバリィ       :   : [p]  バルーンシードショット :   : [p]  パラミス        :   : [p]  バクメ         :   : [p]  ヴォパ         :   : [p]  ヒルスプ        :   : [p]  イニブ         :   : ■装備■ ・基本命中力、追加ダメージ、基本回避力        Lv 命中 追ダメ 回避 ファイター : グラップラー: フェンサー : シューター : ・武器 価格  用法 必筋 修正 命中 威力 C値 追ダメ [カテゴリ・ランク] 名称(*:装備している) / 備考 (参照) 33900   2H  25   1   1  100   9   3 [フレイルA] *風のイグニダイト製テムスガルドのチェインハンマー+1OM2 / 発動体加工済み (p) 231000  2H  39   1   1  174   8   3 [フレイルSS] *風のイグニダイト製スリーハンドグルスマギア+3 / エラーが出るけど実際には+3で42 k82を2回振る (p)      2H   0   1   1  160   9  12 [投擲SS] *51cm砲弾 / C-1命中+1 12本セット (p) =価格合計= 264900 G ・防具    必筋 回避 防護  価格  名称 / 備考 鎧 :     2   2     ミモレの極上布鎧 / 回避+2 盾 :              / 修正: = 合計 =   38   2    0 G (回避技能:バトルダンサー) ・装飾品    価格  名称            / 効果 頭 :5000  ディスプレーサーガジェット / 頭 :1000  巧みの腕輪         / 耳 :8600  ラル=ヴェイネの金鎖    / 耳 :1000  敏捷の腕輪         / 顔 :10000 英雄の証技         / 首 :7200  銀鈴            / 首 :8000  フローティングシールド   / 背中:10000 野伏のセービングマント   / 背中:25000 スマルティエの風切羽    / 右手:500  筋力の腕輪         / 左手:24800 操りの腕輪         / 左手:    エルエレナケープ      / 回避+1 腰 :1000  テルティウスマヌス     / 3H武器を持てる 足 :1000  華美なる宝石飾り      / 他 :500  アルケミーキット      / =合計=103600 G ■所持品■ 名称                    単価  個数 価格  備考 予備のテムスガルドのチェインハンマー    33900  5   169500 加工は1本目と同じ ひらめき眼鏡                4000  1   4000  探索路だけつける カトレアの花冠               10000  1   10000  つけたり付けなかったり インテリアにマルサック           8600  1   8600  探索用 予備の風のイグニダイト製シルバーコメット+3 231000 1   231000 =所持品合計=   423100 G =装備合計=    368500 G = 価格総計 =   791600 G 所持金   1069600G 預金・借金    G ■魔力■ 知力ボーナス: 5 特技強化ボーナス: 0 武器ボーナス: 0  名前  Lv 追加修正 魔力 妖精魔法 14      19 ■言語■       話 読            話 読 共通交易語 ○ ○ / 巨人語       - - エルフ語  - - / ドラゴン語     - - ドワーフ語 - - / ドレイク語     - - 神紀文明語 - - / 汎用蛮族語     - - 魔動機文明語○ ○ / 魔神語       - - 魔法文明語 - - / 妖魔語       - - 妖精語   ○ - / グラスランナー語  - - シャドウ語 - - / ミアキス語     - - バルカン語 - - / ライカンスロープ語 - - ソレイユ語 - - ・地方語、各種族語     話 読 名称 初期習得言語:交易交通語、妖精語 技能習得言語:魔動機文明語 ■名誉アイテム■ 点数 名称 540 アビス強化 所持名誉点:5071 点 合計名誉点:5611 点 ■その他■ 経験点:44650点 (使用経験点:247000点、獲得経験点:288650点) セッション回数:271回 成長履歴: 成長能力  獲得経験点(達成/ボーナス/ピンゾロ) メモ 1-      50000点(   /50000 / 回) 2-      40000点(   /40000 / 回) 3-      60000点(   /60000 / 回) 4-       3250点(   /3250 / 回)  夢5層中層次世代超高機動魔動戦闘機戦 筋力生命器用 5-       1600点(1450 / 150 / 回)  EE37 敏捷生命 6-       2510点(2160 / 350 / 回) 7-       2640点(2540 / 100 / 回) 8-       2550点(2100 / 450 / 回) 9-       1250点(1000 / 250 / 回)  器用知力 EE40 10-      2080点(1830 / 250 / 回)  筋力器用 EE41 11-      1480点(1480 /   / 回)  生命 CL 12-      14310点(13510 / 800 / 回) ドゥーム=EE46 敏捷3 器用6 筋力2 知力 生命 13-      2100点(1950 / 150 / 回)  EE47 筋力生命 14-      2330点(2080 / 250 / 回)  EE48 器用敏捷 15-      3560点(3360 / 200 / 回)  EE49敏捷敏捷敏捷筋力 16-      4300点(4050 / 250 / 回)  EE50-51 器用器用敏捷筋力 17-      2850点(2600 / 250 / 回)  奈落の夢5層エレメンタル 18-      5450点(4950 / 500 / 回)  奈落の夢5層深層 19-      2450点(2200 / 250 / 回) 20-      2950点(2900 / 50 / 回)  器用、筋力、敏捷、精神、器用、敏捷、生命 21-      6930点(6280 / 650 / 回) 22-      2600点(2500 / 100 / 回) 23-      3000点(2800 / 200 / 回)  知力筋力敏捷 24-      2500点(2300 / 200 / 回) 25-      2500点(2350 / 150 / 回) 26-      2910点(2810 / 100 / 回) 27-      2550点(2500 / 50 / 回) 28-      11150点(10000 /1150 / 回) 29-      2700点(2500 / 200 / 回) 30-      10150点(10000 / 150 / 回) 敏捷、器用、敏捷、筋力、生命生命生命生命、知力 31-      15350点(15350 /   / 回) 器用4敏捷4筋力4知力3 32-      1950点(1850 / 100 / 回) 33-      2650点(2350 / 300 / 回)  器用敏捷 34-      2650点(2350 / 300 / 回)  敏捷、敏捷、器用 35-      2600点(2250 / 350 / 回)  器用、器用、敏捷 36-      2550点(2250 / 300 / 回)  器用器用 37-      3400点(3250 / 150 / 回)  器用、敏捷 38-      2850点(2500 / 350 / 回)  筋力、敏捷、筋力 メモ: import csv import io import re from typing import List, Optional from fastapi import FastAPI, File, UploadFile, HTTPException from pydantic import BaseModel, field_validator, ValidationError app = FastAPI() # --------------------------------------------------------- # 1. 定数と正規表現の定義 # --------------------------------------------------------- EXPECTED_HEADERS = ["code_id", "website_url", "quantity"] # 英字-数字-数字 (例: A-12-34, Z-01-999) # ^[a-zA-Z] : 先頭は英字1文字 # -     : ハイフン # \d+    : 数字が1文字以上 REGEX_CODE_FORMAT = re.compile(r"^[a-zA-Z]-\d+-\d+$") # --------------------------------------------------------- # 2. 1行分のデータモデル定義 (バリデーションロジック) # --------------------------------------------------------- class CsvRowModel(BaseModel):   code_id: str   website_url: str   quantity: int   # バリデーション: 英字-数字-数字   @field_validator('code_id')   @classmethod   def validate_code_format(cls, v: str):     if not REGEX_CODE_FORMAT.match(v):       raise ValueError(f"フォーマット不正です (期待値: 英字-数字-数字, 入力値: )")     return v   # バリデーション: http/https形式   @field_validator('website_url')   @classmethod   def validate_url_format(cls, v: str):     if not (v.startswith("http://") or v.startswith("https://")):       raise ValueError(f"URLはhttpまたはhttpsで始まる必要があります (入力値: )")     return v   # quantityは型ヒントが int なので、Pydanticが自動的に   # 数値以外が入ってきた場合にエラーを出してくれます。 # --------------------------------------------------------- # 3. エンドポイントの実装 # --------------------------------------------------------- @app.post("/upload-csv/") async def upload_csv(file: UploadFile = File(...)):   # MIMEタイプの簡易チェック   if file.content_type != "text/csv":     raise HTTPException(status_code=400, detail="CSVファイルのみアップロード可能です。")   # ファイルの中身を読み込む   content = await file.read()   # デコード処理 (Excel保存のCSVなどは shift-jis の場合があるので注意)   try:     decoded_content = content.decode("utf-8")   except UnicodeDecodeError:     # utf-8で失敗した場合、cp932(Shift_JIS拡張)を試すなどの処理を入れるのが一般的     try:       decoded_content = content.decode("cp932")     except UnicodeDecodeError:       raise HTTPException(status_code=400, detail="ファイルのエンコーディング形式がサポートされていません。UTF-8を推奨します。")   # CSVリーダーの作成   io_stream = io.StringIO(decoded_content)   csv_reader = csv.reader(io_stream)   # データをリスト化   rows = list(csv_reader)   if not rows:     raise HTTPException(status_code=400, detail="ファイルが空です。")   # --- チェック1: ヘッダーの検証 ---   header = rows[0]   # 空白除去などをしつつ比較   clean_header = [h.strip() for h in header]   if clean_header != EXPECTED_HEADERS:     raise HTTPException(       status_code=400,       detail=f"ヘッダーが正しくありません。期待値: , 入力値: "     )   # --- チェック2 & 3: データ行の検証 ---   valid_data = []   errors = []   # 1行目はヘッダーなのでスキップして2行目(index 1)から開始   for i, row in enumerate(rows[1:], start=2):     # カラム数が合っているか確認     if len(row) != len(EXPECTED_HEADERS):       errors.append(f"行 : カラム数が一致しません。")       continue     try:       # Pydanticモデルを使って検証       row_data = CsvRowModel(         code_id=row[0].strip(),         website_url=row[1].strip(),         quantity=row[2].strip() # Pydanticがここで int("abc") -> エラー を検知       )       valid_data.append(row_data.model_dump())     except ValidationError as e:       # Pydanticのエラーメッセージを見やすく整形       error_msgs = []       for err in e.errors():         loc = err['loc'][0] # エラーが起きたフィールド名         msg = err['msg']  # エラーメッセージ         error_msgs.append(f": ")       errors.append(f"行 エラー: ")     except Exception as e:       errors.append(f"行 予期せぬエラー: ")   # エラーがあれば400として返す(または200でエラーリストを返す仕様も可)   if errors:     return "CSVのバリデーションに失敗しました。",       "errors"   # 全て成功した場合   return f" 件のデータを正常に読み込みました。",     "data" if __name__ == "__main__":   import uvicorn   uvicorn.run(app, host="0.0.0.0", port=8000)