CodeGym /행동 /SQL SELF /CSV에서 데이터 로드를 위한 테이블 준비하기

CSV에서 데이터 로드를 위한 테이블 준비하기

SQL SELF
레벨 23 , 레슨 2
사용 가능

이제 진짜로 CSV 파일에서 대량 데이터 로드를 위해 테이블을 준비해보자. 혹시 "아니, 테이블 준비가 왜 필요해? 뭐가 그렇게 어려워?"라고 생각한다면, 아직 현실 세계에 대해 더 배워야 할 게 많아. 어떤 파일도 "완벽"하지 않아. 항상 뭔가 문제가 있어 — 중복, 쓸데없는 공백, 데이터 타입 오류, 아니면 그냥 구조가 안 맞는 경우도 있지.

CSV 파일을 문제없이 로드하려면 어떻게 데이터베이스를 준비해야 하는지 같이 알아보자.

CSV 파일을 로드하기 전에, 데이터가 데이터베이스에 어떻게 저장될지 먼저 정해야 해. 즉, 먼저 알맞은 구조로 테이블을 만들어야 해.

예시: 학생 데이터 로드하기

예를 들어, 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,       -- 학생의 고유 식별자
    name VARCHAR(100) NOT NULL,  -- 학생 이름 (최대 100자)
    age INT CHECK (age > 0),     -- 학생 나이 (0보다 커야 함)
    email VARCHAR(100) UNIQUE,   -- 고유한 이메일
    major VARCHAR(100)           -- 전공
);
  • id SERIAL PRIMARY KEY: 각 행을 고유하게 식별하기 위한 기본 키를 추가했어. 만약 CSV 파일에 이미 고유 식별자가 있다면, 파일의 id 컬럼을 써도 돼.
  • name VARCHAR(100) NOT NULL: 학생 이름은 꼭 있어야 하고, 최대 100자까지 가능해.
  • age INT CHECK (age > 0): 나이는 숫자여야 하고, 항상 0보다 커야 해.
  • email VARCHAR(100) UNIQUE: 이메일은 중복되면 안 돼. 중복된 레코드를 막기 위해서야.
  • major VARCHAR(100): 학생의 전공을 나타내. 여기엔 별다른 제한 없어.

테이블 구조는 데이터에 맞게 잘 설계되어야 하고, 동시에 잘못된 데이터로부터 보호해줘야 해. 이렇게 하면 로드할 때 에러가 줄어들어.

데이터 로드 전 데이터 확인하기

CSV 파일에는 종종 예상치 못한 문제가 숨어 있어. 데이터를 로드하기 전에, 테이블 구조에 맞는지 꼭 확인해야 해.

어떻게 데이터를 확인할까?

  1. 컬럼 일치 여부
    CSV의 컬럼 수가 테이블의 컬럼 수와 같은지 확인해. 예를 들어, 테이블에 5개 컬럼이 있는데 CSV 파일에 6개 컬럼이 있으면, 로드할 때 에러가 나.

  2. 데이터 타입
    각 컬럼의 데이터가 기대하는 타입과 맞는지 확인해. 예를 들어, 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

해결법: 빈 값을 허용 가능한 값으로 바꿔. 예를 들어, 빈 ageNULL로 바꿔.

쓸데없는 공백
문자열 앞뒤에 공백이 있으면 문제가 생길 수 있어. 예를 들어, "Alex""Alex"는 다르게 인식돼.

Python으로 해결: 공백을 제거해.

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

잘못된 문자나 인코딩
파일에 데이터베이스와 호환되지 않는 특수문자가 있으면, 로드가 실패할 수 있어.

예시: 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()  # 이메일을 소문자로 변환
df['age'] = df['age'].fillna(0)  # 나이 결측값 채우기
df['age'] = df['age'].astype(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