CSVインポート機能 v2
概要
この機能は、競馬データ(レース情報、出走馬情報、オッズ)を CSV からまとめて取り込み、WEBアプリのデータベースに登録するためのツールです。ブラウザUIでファイルをアップロードして、項目(CSV列)とデータベースのフィールドを視覚的にマッピング(紐付け)してから一括でインポートできます。
この記事で紹介する機能は『ゼロから作る競馬予想モデル・機械学習入門』で作成しているWEBアプリにインポートするためのCSVファイルが必要になります。
CSVファイル作成手順は以下の記事を参考にしてください。
【生成AI×競馬】出馬表をGemini+MCPで取得︕【プロンプト公開】
よろしければ、チャンネル登録・ゼロから作る競馬予想モデル・機械学習入門シリーズ・ソース取得よろしくお願いいたします
- チャンネル
【ゼロから作る競馬予想モデル・機械学習入門】ゆっくりデータサイエンスLabPythonで作る機械学習モデルを使った競馬予想AIとその競馬予想プログラムを運用するソフトの開発を通して、機械学習モデルの使い方やデータサイエンスの勘所がつかめるチャンネルです。ゼロから競馬予想モデルを作れるだけでなく、データサイエンティ... - ゼロから作る競馬予想モデル・機械学習入門シリーズ
ゼロから作る競馬予想モデル・機械学習入門個人サイトで、競馬予想プログラムソフト開発の詳細などをまとめています。 また、Bookersでソース公開もしていますので、一緒に開発していきたい方の助けになると嬉しいです。 - ソース
ゼロから作る競馬予想モデル・機械学習入門競馬予想プログラムソフトの開発をしている者です。今回は第一弾から第四弾記事の総集編になります。本記事を通して、ゼロからPythonを使…
主な機能:
- 年度を指定して CSV をインポート(年度ごとにデータを分ける)
- 3種類のCSVを取り込み可能:
- レース情報(race_info) — 必須
- 出走馬情報(race_horse) — 必須
- オッズ情報(odds) — 任意
- CSVヘッダー行を自動読み込みして、ドラッグ操作でCSV列とDB列を視覚的に接続(マッピング)
- マッピングの保存/読み込み(同じ形式のファイルを再利用可能)
- マッピングに従って一時CSVを作成し、サーバーでDBに登録
- インポート結果はサーバーログ/DBで確認可能
できること
- 手軽に複数レースを一括投入:1つのCSVに複数レースを書いておけば、一括で登録できます。
- マッピング情報はファイル名単位で「保存」しているため、次回から同じファイル名のCSVを簡単にインポートすることが可能。
- オッズCSVを追加すれば、オッズの時系列情報も登録できる。
- ファイル中の race_id をキーに、関連するレース情報・馬情報が紐づけられる(race_id は 12 桁の数字が推奨; netkeiba様準拠)。
デモ動画
手順1: CSV インポート画面表示
本WEB画面のHome画面(./index.html)上の「CSV インポート V2」ボタン押下するとCSVインポート画面が表示されます

手順2: CSVインポート用ファイルを指定
レース情報のCSVファイルと出走馬情報のCSVファイルを2種類指定します。
オッズ情報がある場合はそちらも選択。CSVファイル形式はCSVインポート画面の下部にある「CSVファイル形式の説明は > こちら」から確認できます。

生成AIを使って、出馬表をスクレイピングしてCSVファイルへ変換する方法は以下の記事で紹介しています
【生成AI×競馬】出馬表をGemini+MCPで取得︕【プロンプト公開】
手順3: マッピングの実施
左と右でそれぞれカラム一覧が表示されます
左がCSVファイルのファイル形式、右が登録先DBのカラム形式になっています
CSVカラムをホールドして、登録先のDBカラムへドラッグすることでUI上でマッピングを作成できます

マッピングを間違えた場合でも、DB側の対象のカラムをクリックするか、正しいカラムでドラッグ&ドロップすることで変更も可能です
このマッピングを「レース情報」と「出走馬情報」両方行います

手順4: マッピング完了後「決定」ボタン押下
マッピングができたら「決定(インポート&マッピング保存)」ボタンを押下するとインポートが開始されます

手順5: インポート完了後画面更新
インポート完了するとその旨の画面が表示されます
元のHome画面に戻って、画面を更新するとインポートしたデータが表示されます

確認: マッピング保存されてることを確認
インポート画面で再度同じファイル名のCSVファイルを指定すると、さっきマッピングした組み合わせが復元されることを確認

簡単なワークフロー(図解)
以下はCSVインポート機能の流れです。
mermaid のフロー図:
flowchart TD
A[ユーザ: CSVファイルを準備] --> B[ブラウザ: CSVアップロード画面を開く]
B --> C[年度選択 & ファイル選択]
C --> D[マッピング画面へ移動]
D --> E[CSV列 と DB列 をドラッグで紐付け]
E --> F[マッピングを保存]
F --> G[インポート 実行]
G --> H[サーバー: 一時CSV作成 -> Importer実行]
H --> I[DBに RaceInfo / RaceHorseData / OddsExtract が追加/更新]
I --> J[ユーザ: 結果確認(ログまたは管理画面)]
マッピングの仕組み(図解)
UIは CSV のヘッダー(例: ["race_id","race_name","start_time"])を左に、DB 側の想定カラム(例: ["race_id","race_name","race_date","start_time"])を右に表示します。ユーザは左から右へ線を引き、どのCSV列をどのDBカラムに入れるか決めます。内部的には次のようなデータ構造になります。
mermaid のシーケンス図(簡易):
sequenceDiagram
participant UI
participant Server
UI->>UI: CSV読み込み -> csvColumns 作成
UI->>UI: DBカラム取得(/api/db_columns)
UI->>Server: mapping 保存
UI->>Server: /api/csv_import with fileContent + mapping
Server->>Server: mapping に基づき一時CSV生成
Server->>DB: Importer 実行 -> レコード作成/更新
マッピングのデータ例(概念):
- csvColumns: ["race_id","race_name","start_time"]
- dbColumns: ["race_id","race_name","race_date","start_time"]
- lines: [{csvIndex:0, dbIndex:0}, {csvIndex:1, dbIndex:1}, {csvIndex:2, dbIndex:3}]
ここで csvIndex は csvColumns の位置、dbIndex は dbColumns の位置を指します。
具体的なステップ(画面操作)
- Home画面で CSV インポートページを開く(上部の「CSVインポート V2」ボタンをクリック)。
- 年度を選択(その年度向けにデータが格納されます)。
- 「レース情報(race_info)」ファイルを選択(必須)。
- 「出走馬情報(race_horse)」ファイルを選択(必須)。
- 必要に応じて「オッズ(odds)」ファイルを選択(任意)。
- 「マッピングへ進む」をクリック。
- マッピング画面:
- 左に CSV の列名(ヘッダー)が並ぶ。
- 右にシステム側の DB カラム名が並ぶ。
- ドラッグして線を引き、CSV列 → DBカラム を対応づける。
- 必須カラム(例: race_id, horse_id 等)が正しくマッピングされているか確認。
- 「マッピングを保存」しておけば、同じファイル名を次回にロードできる(便利)。
- 「インポート」を押すと処理が始まる。完了すれば完了画面に切り替わる。
使う上でのポイント
- race_id は 12 桁の数値で統一してください。3つのファイルで同じ race_id を使うことで関連付けが行われます。
- CSV エンコーディングは UTF-8 推奨(日本語が含まれる場合は特に注意)。
- ヘッダー行は必須。1行目をヘッダーにしてください。
- マッピング保存は「ファイル名単位」です。ファイル名が違うと自動読み込みはされません。
- 先にマッピングを作って保存しておけば、次回は同じファイル名をアップロードするだけでマッピング情報が自動反映されます。
- オッズは任意ですが、入れると 時系列オッズが画面上で確認できます。
インポートしたデータの確認
インポートに成功すると、取得したレースの開催月のページに取り込んだレース情報が表示されます。
画面の使い方については、以下の動画を参照ください。
よくある問題
- 文字化けする(ファイルが Shift_JIS 等の場合):
- 対処: UTF-8 に変換して再アップロード(Excel で「エンコード指定して保存」またはテキストエディタで変換)。
- race_id が合っているのに紐づかない:
- 対処: ヘッダー名の誤差(全角/半角・大文字小文字)やマッピングで race_id が正しい DB カラムに紐づいているか確認。
- マッピングを間違えた:
- 対処: マッピング保存ファイルを削除して再設定するか、UI で線を外して修正する。
- インポートが途中で止まる/エラーになる:
- 対処: ログ(エラーメッセージ)を確認。操作側ではCSVの1行目(ヘッダー)と必須カラムの有無を確認する。
例:よくあるユースケース
- 新シーズン開始時に前年のレースデータをまとめて取り込みたい:
- 年度を指定して、複数CSVを一度に取り込むだけで主要データが揃います。
- 提供元から毎週届く同一フォーマットCSVを自動で登録したい:
- 初回にマッピングを作って保存しておけば、次回は同じファイル名/フォーマットで素早く登録できます。
図解:簡単なデータフロー(補足)
flowchart LR
subgraph Browser
U1[Upload CSVs] --> U2[Mapping UI]
end
User1[ユーザ
(CSVインポート V2押下)] --> U1
subgraph Server
TMP[一時CSV生成] --> Importer[CsvRaceImporter / OddsCsvImporter]
Importer --> DB[(Database)]
end
U2 -->|mapping + fileContent| TMP
Server -->|mapping JSON 保存| MAPPING[static/.../mapping_store]
DB -->|結果確認| User2[ユーザ(Home画面更新)]

コメント