首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我可以从带有头的csv文件中自动创建PostgreSQL中的表吗?

我可以从带有头的csv文件中自动创建PostgreSQL中的表吗?
EN

Stack Overflow用户
提问于 2014-01-09 10:57:21
回答 10查看 123.6K关注 0票数 87

我在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文件中自动创建表吗?

EN

Stack Overflow用户

发布于 2019-07-04 17:31:33

我通过以下步骤实现了这一目标:

  1. 将csv文件转换为utf8
代码语言:javascript
运行
复制
    iconv -f ISO-8859-1 -t UTF-8 file.txt -o file.csv
  1. 使用这个python脚本创建要创建表和复制的sql。
代码语言:javascript
运行
复制
#!/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.使用

代码语言:javascript
运行
复制
python3 importar.py

可选:编辑sql脚本以调整字段类型(默认情况下都是文本)

  1. 运行sql脚本。控制台的缩写
代码语言:javascript
运行
复制
sudo -H -u postgres bash -c "psql mydatabase < file.sql" 
票数 4
EN
查看全部 10 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21018256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档