将包含大量列的大型csv导入postgreSQL
我有一个2550列的csv文件,我想把它导入postgreSQL 为了在postgreSQL中导入csv,首先我应该创建表,并使用将包含大量列的大型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)| ---|---------|
\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
。现在,它对提供的数据适用。