CodeGym /课程 /SQL SELF /为从CSV导入数据准备表结构

为从CSV导入数据准备表结构

SQL SELF
第 23 级 , 课程 2
可用

咱们终于要动手准备表格,来批量导入CSV文件里的数据啦。如果你在想:“为啥还要专门准备表?这有啥难的?”,那你还真得多了解下真实世界。没有哪个文件是“完美”的。总会有点小坑——比如重复、乱七八糟的空格、数据类型错了,或者结构根本对不上。

来看看怎么把数据库准备好,让CSV文件能顺利导入,不出幺蛾子。

在导入CSV文件之前,先想清楚数据要怎么存到库里。也就是说,得先建个结构合适的表。

例子:导入学生信息

假设我们有个CSV文件students.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,   -- 唯一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。用表格工具打开文件,看看有没有空行或者奇怪的数据。

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)

非法字符或编码问题
文件里有些特殊字符,数据库不认,导入就会失败。

例子:用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)  # 年龄转整数

# 保存到新文件
df.to_csv('cleaned_students.csv', index=False)

导入前一定要检查数据。记住:好程序员都提前抓bug,省自己时间!

表结构和数据准备小清单

开始搞CSV之前,先确认:

  • 表结构和数据匹配(列、数据类型、约束都对)。
  • CSV文件没有空行、多余空格或非法字符。
  • 文件编码和PostgreSQL兼容(最好用UTF-8)。
  • 你用上了数据分析和清洗工具(比如Python、Excel)。

现在你已经可以导入CSV数据啦!不过在动手之前,记得再检查下表结构和数据清洗没问题。下节课我们继续聊怎么把数据导入PostgreSQL,包括错误处理和冲突解决。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION