CodeGym /コース /SQL SELF /CSVからデータをインポートするためのテーブル準備

CSVからデータをインポートするためのテーブル準備

SQL SELF
レベル 23 , レッスン 2
使用可能

じゃあ、いよいよCSVファイルから大量データをインポートするためのテーブル準備をやってみよう。もし「え、テーブル準備なんて必要?何がそんなに難しいの?」って思ってるなら、現実世界についてまだまだ知らないことが多いよ。どんなファイルも「完璧」なんてことはない。必ずどこかに問題があるんだ ― ダブり、余計なスペース、データ型のミス、構造のズレとかね。

じゃあ、どうやってちゃんとテーブルを準備して、CSVファイルをトラブルなくインポートできるようにするか見ていこう。

まずCSVファイルをインポートする前に、データをどうやってDBに保存するか決めよう。つまり、最初にちゃんとした構造でテーブルを作るってこと。

例:学生データのインポート

たとえば、students.csv っていう学生情報のCSVファイルがあるとする。中身はこんな感じ:

id,name,age,email,major
1,Alex,20,alex@example.com,Computer Science
2,Maria,21,maria@example.com,Mathematics
3,Otto,19,otto@example.com,Physics

これを元にテーブルを作ってみよう:

CREATE TABLE students (
    id SERIAL PRIMARY KEY,       -- 学生のユニークID
    name VARCHAR(100) NOT NULL,  -- 学生の名前(最大100文字)
    age INT CHECK (age > 0),     -- 学生の年齢(0より大きい必要あり)
    email VARCHAR(100) UNIQUE,   -- ユニークなemail
    major VARCHAR(100)           -- メイン専攻
);
  • id SERIAL PRIMARY KEY: 各行をユニークに識別するための主キーを追加したよ。もしCSVファイルにすでにユニークIDがあるなら、そのidカラムを使おう。
  • name VARCHAR(100) NOT NULL: 学生の名前は必須で、100文字までに制限してる。
  • age INT CHECK (age > 0): 年齢は数字で、0より大きいことをチェックしてる。
  • email VARCHAR(100) UNIQUE: emailはユニークじゃないとダブりが出ちゃうからね。
  • major VARCHAR(100): 学生のメイン専攻。ここは特に制限なし。

テーブルはちゃんとデータに合うように設計して、かつ変なデータが入らないように守ってくれる構造にしよう。これでインポート時のエラーも減るよ。

インポート前のデータチェック

CSVファイルにはよく「サプライズ」がある。データをインポートする前に、ちゃんとテーブル構造に合ってるか確認しよう。

どうやってデータをチェックする?

  1. カラムの一致
    CSVのカラム数がテーブルのカラム数と合ってるか確認しよう。たとえばテーブルに5カラムあるのに、CSVに6カラムあったらエラーになるよ。

  2. データ型
    各カラムのデータが期待される型になってるかチェックしよう。たとえばageカラムには整数だけが入ってるか、みたいな感じ。

バリデーション用ツール

ExcelやGoogle Sheets。表計算ソフトでファイルを開いて、空行や変なデータがないか確認しよう。

Pythonpandasライブラリを使ってデータ型をチェックできるよ:

import pandas as pd

# CSVを読む
df = pd.read_csv('students.csv')

# データをチェック
print(df.dtypes)  # 各カラムのデータ型を表示
print(df.isnull().sum())  # 空値のチェック

インポート前のデータクレンジング

外部ソースからのデータはたいていクレンジングが必要。そうしないとインポート時にエラーが出るリスクが高いよ。

CSVファイルでよくある問題

空行や空カラム
必須カラム(NOT NULL)が空だとエラーになる。

ダメなデータ例:

id,name,age,email,major
1,Alex,20,alexey@example.com,Computer Science
2,Maria,,maria@example.com,Mathematics

解決法:空値を許容できる値に変換しよう。たとえば空のageNULLにするなど。

余計なスペース
文字列の前後にスペースがあると問題になることがある。たとえば"Alex""Alex"は別物として扱われる。

Pythonでの解決例:余計なスペースを削除しよう。

df = df.apply(lambda x: x.str.strip() if x.dtype == "object" else x)

変な文字やエンコーディング
DBで扱えない特殊文字があると、インポートが失敗することも。

例:iconvアプリでエンコーディングを変換する:

iconv -f WINDOWS-1251 -t UTF-8 students.csv > students_utf8.csv

データクレンジング:Pythonでの例

import pandas as pd

# ファイルを読む
df = pd.read_csv('students.csv')

# データをクレンジング
df['name'] = df['name'].str.strip()  # スペースを削除
df['email'] = df['email'].str.lower()  # emailを小文字に
df['age'] = df['age'].fillna(0)  # 年齢の空値を0で埋める
df['age'] = df['age'].astype(int)  # 年齢をint型に変換

# 新しいファイルに保存
df.to_csv('cleaned_students.csv', index=False)

インポート前に必ずデータをチェックしよう。覚えておいて:いいプログラマーは問題を事前に見つけて自分の時間を節約するんだ!

テーブルとデータ準備のための便利なチェックリスト

CSVを扱う前にこれをチェックしよう:

  • テーブル構造がデータに合ってるか(カラム、データ型、制約)。
  • CSVファイルに空行、余計なスペース、変な文字がないか。
  • ファイルのエンコーディングがPostgreSQLで使えるか(UTF-8がベスト)。
  • データ分析やクレンジングのツール(PythonやExcelなど)を使ってるか。

これでCSVからのデータインポート準備はバッチリ!でも実際にインポートする前に、テーブル構造とデータがちゃんと整ってるかもう一度確認しよう。次のレクチャーでは、PostgreSQLへのデータインポートの流れ、エラー処理やコンフリクト対応についてもやっていくよ。

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION