Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将包含大量列的大型csv导入postgreSQL_Postgresql_Csv - Fatal编程技术网

将包含大量列的大型csv导入postgreSQL

将包含大量列的大型csv导入postgreSQL,postgresql,csv,Postgresql,Csv,我有一个2550列的csv文件,我想把它导入postgreSQL 为了在postgreSQL中导入csv,首先我应该创建表,并使用\copy将csv复制到表中。但是,如果表中有大量的列,比如我的案例,我无法手动创建表,该怎么办呢 有解决办法吗 更新 数据结构如下: dZ(01)到dZ(2550)基本上在-50到+50之间: id | date | time | localtime | pid | dZ(0)..dZ(1)......dZ(2550)| ---|---------|

我有一个2550列的csv文件,我想把它导入postgreSQL

为了在postgreSQL中导入csv,首先我应该创建表,并使用
\copy
将csv复制到表中。但是,如果表中有大量的列,比如我的案例,我无法手动创建表,该怎么办呢

有解决办法吗

更新

数据结构如下: dZ(01)到dZ(2550)基本上在-50到+50之间:

id | date    | time      | localtime | pid | dZ(0)..dZ(1)......dZ(2550)|
---|---------|-----------|-----------|-----|---------------------------|
17|11-11-2014| 16:33:21 | 1.45E+15   |2375 |0 0 0 0 0 -1 0 -1 0 -5 -10|
CSV结构:(我使用了“;”分隔符)


这是一行数据。

dZ
列导入文本列,然后将其转换为数组:

create table t (
    id int,
    datetime timestamp,
    localt double precision,
    pid int,
    dz integer[]
);
创建临时表:

create table s (
    id int,
    date date,
    time time,
    localt double precision,
    pid int,
    dz text
);
设置日期样式:

set datestyle = 'DMY';
导入到临时表中

\copy s from '/home/cpn/codigo/file.csv' with (format csv, delimiter ';')
创建最终表格,将日期和时间合并为时间戳,并将
dZ
转换为数组:

create table t (
    id int,
    datetime timestamp,
    localt double precision,
    pid int,
    dz integer[]
);
从临时文件中填充最终文件:

insert into t (id, datetime, localt, pid, dz)
select
    id, date + time, localt, pid,
    regexp_split_to_array(dz, '\s')::int[]
from s

dZ
列导入文本列,然后将其转换为数组:

create table t (
    id int,
    datetime timestamp,
    localt double precision,
    pid int,
    dz integer[]
);
创建临时表:

create table s (
    id int,
    date date,
    time time,
    localt double precision,
    pid int,
    dz text
);
设置日期样式:

set datestyle = 'DMY';
导入到临时表中

\copy s from '/home/cpn/codigo/file.csv' with (format csv, delimiter ';')
创建最终表格,将日期和时间合并为时间戳,并将
dZ
转换为数组:

create table t (
    id int,
    datetime timestamp,
    localt double precision,
    pid int,
    dz integer[]
);
从临时文件中填充最终文件:

insert into t (id, datetime, localt, pid, dz)
select
    id, date + time, localt, pid,
    regexp_split_to_array(dz, '\s')::int[]
from s

考虑到最大值为1600列,所以我将csv分为两个表,每个表有1000列,我编写了一个python代码来创建dz列,效果很好:

import psycopg2
sqlstring="CREATE TABLE z(id bigint, date date, time time,"
for i in range(1001):
    if(i<1000):
        sqlstring+="dz"+str(i)+ " int,"
    elif i==1000:
        sqlstring+="dz"+str(i)+ " int"        
sqlstring += ");"

connection = psycopg2.connect("dbname='mydb' user='qfsa' host='localhost' password='123' port=5433")
cursor=connection.cursor();
cursor.execute(sqlstring)
connection.commit()
导入psycopg2
sqlstring=“创建表z(id bigint、日期、时间,”
对于范围(1001)内的i:

如果(i考虑到最大值是1600列,所以我将csv分为两个表,每个表有1000列,我编写了一个python代码来创建dz列,它工作得很好:

import psycopg2
sqlstring="CREATE TABLE z(id bigint, date date, time time,"
for i in range(1001):
    if(i<1000):
        sqlstring+="dz"+str(i)+ " int,"
    elif i==1000:
        sqlstring+="dz"+str(i)+ " int"        
sqlstring += ");"

connection = psycopg2.connect("dbname='mydb' user='qfsa' host='localhost' password='123' port=5433")
cursor=connection.cursor();
cursor.execute(sqlstring)
connection.commit()
导入psycopg2
sqlstring=“创建表z(id bigint、日期、时间,”
对于范围(1001)内的i:

如果(我回答有点老了,只是为了那些还在看的人。 这可以使用python来完成

将数据帧中的数据视为df

df= df.rename(columns=str.lower)

from sqlalchemy import create_engine
engine = create_engine('postgresql://username:password@localhost:5432/mydatabase')

df.to_sql('table_name', engine)

回答有点老了,只是为了方便那些仍在寻找答案的人。 这可以使用python来完成

将数据帧中的数据视为df

df= df.rename(columns=str.lower)

from sqlalchemy import create_engine
engine = create_engine('postgresql://username:password@localhost:5432/mydatabase')

df.to_sql('table_name', engine)

恐怕表中的列数限制在1600列以内,所以您可能需要尝试设置自定义分隔符并将整行作为一列导入,以便以后您可以选择
split\u part
或regex作为几列。但无论如何,您无法将所有2550行导入同一个表。每一行有多大?可能您需要uld将其导入一个只有一列的表中,并在数据库中处理。一个有那么多列的表在关系数据库中没有多大意义。看起来像重复组。可能将其存储到数组中?顺便说一句:日期+时间应该是一(时间戳)字段。可以使用外部数据包装器将CSV文件的行映射到Postgres中的单个数组。然后可以使用Postgres数组函数拆分表或获取“列”的子集恐怕表中的列数限制为1600列,因此您可能需要尝试设置自定义分隔符,并将整行作为一列导入,以便稍后您可以选择
split\u part
或regex到多个列中。但无论如何,您无法将所有2550行导入到同一个表中。每一行有多大?也许您可以导入将其排序到只有一列的表中,并在数据库中处理。在关系数据库中,有那么多列的表没有多大意义。看起来像重复组。可能将其存储到数组中?顺便说一句:日期+时间应该是一(时间戳)字段。可以使用外部数据包装器将CSV文件的行映射到Postgres中的单个数组。然后可以使用Postgres数组函数拆分表或获取“列”的子集2500列的表很难闻!我喜欢你的数组解决方案。也许目标表结构应该规范化为每行1个值或其他什么。除非数组真的有意义。我尝试了这个解决方案,但数组在s和t表中都是空的。我用数据结构更新了我的问题,知道吗?@Safariba我会检查它稍后。@Safariba将分隔符更改为
,并修复了
\copy
命令中的语法错误。将
localtime
列的数据类型更改为
double precision
。现在使用提供的数据它对我有效。具有2500列的表味道不好!我喜欢您的数组解决方案。可能是目标表st结构应该规范化为每行1个值或其他值。除非数组真的有意义。我尝试了这个解决方案,但数组在s和t表中都是空的。我用数据结构更新了我的问题,知道吗?@Safariba我稍后会检查。@Safariba将分隔符更改为
,并修复了
中的语法错误\复制
命令。将
localtime
列的数据类型更改为
double precision
。现在,它对提供的数据适用。