逐行读取和存储Postgres中的csv数据

1 投票
3 回答
4251 浏览
提问于 2025-04-16 15:43

我想从不同的文件中复制csv数据,然后把它们存储到一个表格里。但是问题是,每个csv文件的列数不一样,有的文件有3列,有的文件有4列。所以如果一个文件有4列,我只想忽略第四列,只保存前三列。

我用下面的代码可以把数据复制到表格里,但前提是文件里只有3列。

CREATE TABLE ImportCSVTable (
          name varchar(100),
                  address varchar(100),
                  phone varchar(100));




COPY ImportCSVTable (name , address , phone)
         FROM 'path'
        WITH DELIMITER ';' CSV QUOTE '"';

不过,我想逐行检查每一行的数据,然后再把它存储到表格里。

谢谢。

3 个回答

0

你也可以在输入表格中加一个可以为空的第四列,然后在导入数据后把这个多余的列删掉。

0

使用一个文本工具来去掉第四列。这样,你所有的输入文件就会只有三列了。你可以用一些组合的命令,比如 awkcutsed 来处理这个问题,不过具体用哪个要看你的列是怎么排列的。

3

因为你想要一行一行地读取和存储数据,所以使用Python的csv模块会很方便,它可以让你轻松地从CSV文件中读取前3列,而不管后面还有没有多余的列。

你可以构建一个INSERT语句,然后用你喜欢的Python-PostGreSQL模块来执行它。我以前用过pyPgSQL,不知道现在有什么新的选择。

#!/usr/bin/env python
import csv
filesource = 'PeopleAndResources.csv'
with open(filesource, 'rb') as f:
    reader = csv.reader(f, delimiter=';', quotechar='"')
    for row in reader:
        statement = "INSERT INTO ImportCSVTable " + \
        "(name, address, phone) " + \
        "VALUES ('%s', '%s', '%s')" % (tuple(row[0:3]))
        #execute statement

撰写回答