じゃあ、いよいよ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ファイルにはよく「サプライズ」がある。データをインポートする前に、ちゃんとテーブル構造に合ってるか確認しよう。
どうやってデータをチェックする?
カラムの一致
CSVのカラム数がテーブルのカラム数と合ってるか確認しよう。たとえばテーブルに5カラムあるのに、CSVに6カラムあったらエラーになるよ。データ型
各カラムのデータが期待される型になってるかチェックしよう。たとえばageカラムには整数だけが入ってるか、みたいな感じ。
バリデーション用ツール
ExcelやGoogle Sheets。表計算ソフトでファイルを開いて、空行や変なデータがないか確認しよう。
Python。pandasライブラリを使ってデータ型をチェックできるよ:
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
解決法:空値を許容できる値に変換しよう。たとえば空のageをNULLにするなど。
余計なスペース
文字列の前後にスペースがあると問題になることがある。たとえば"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へのデータインポートの流れ、エラー処理やコンフリクト対応についてもやっていくよ。
GO TO FULL VERSION