我在OSX10.6.8上运行PostgreSQL 9.2.6。我想将带有列头的CSV文件中的数据导入数据库。我可以使用COPY
语句来实现这一点,但前提是我首先手动为CSV文件中的每一列创建一个列的表。有没有任何方法可以根据CSV文件中的标头自动创建此表?
每一个这个问题我都试过
COPY test FROM '/path/to/test.csv' CSV HEADER;
但我只知道一个错误:
ERROR: relation "test" does not exist
如果我首先创建一个没有列的表:
CREATE TABLE test ();
我得到:
ERROR: extra data after last expected column
我在PostgreSQL 复印文件中找不到任何关于自动创建表的内容。还有其他方法可以从带有头的CSV文件中自动创建表吗?
发布于 2019-07-04 17:31:33
我通过以下步骤实现了这一目标:
iconv -f ISO-8859-1 -t UTF-8 file.txt -o file.csv
#!/usr/bin/env python3
import csv, os
#pip install python-slugify
from slugify import slugify
origem = 'file.csv'
destino = 'file.sql'
arquivo = os.path.abspath(origem)
d = open(destino,'w')
with open(origem,'r') as f:
header = f.readline().split(';')
head_cells = []
for cell in header:
value = slugify(cell,separator="_")
if value in head_cells:
value = value+'_2'
head_cells.append(value)
#cabecalho = "{}\n".format(';'.join(campos))
#print(cabecalho)
fields= []
for cell in head_cells:
fields.append(" {} text".format(cell))
table = origem.split('.')[0]
sql = "create table {} ( \n {} \n);".format(origem.split('.')[0],",\n".join(fields))
sql += "\n COPY {} FROM '{}' DELIMITER ';' CSV HEADER;".format(table,arquivo)
print(sql)
d.write(sql)
3.使用
python3 importar.py
可选:编辑sql脚本以调整字段类型(默认情况下都是文本)
sudo -H -u postgres bash -c "psql mydatabase < file.sql"
https://stackoverflow.com/questions/21018256
复制相似问题