如何编写一个存储过程,该存储过程从CSV文件导入数据并填充表?
如何编写一个存储过程,该存储过程从CSV文件导入数据并填充表?
Answers:
看一下这篇简短的文章。
解决方案的解释如下:
创建表:
CREATE TABLE zip_codes
(ZIP char(5), LATITUDE double precision, LONGITUDE double precision,
CITY varchar, STATE char(2), COUNTY varchar, ZIP_CLASS varchar);
将数据从CSV文件复制到表格中:
COPY zip_codes FROM '/path/to/csv/ZIP_CODES.txt' WITH (FORMAT csv);
COPY zip_codes FROM '/path/to/csv/ZIP_CODES.txt' DELIMITER ',' CSV HEADER;
postgresql.org/docs/9.1/static/sql-copy.html
如果您没有使用权限COPY
(在db服务器上工作),则可以\copy
改用(在db客户端中工作)。使用与Bozhidar Batsov相同的示例:
创建表:
CREATE TABLE zip_codes
(ZIP char(5), LATITUDE double precision, LONGITUDE double precision,
CITY varchar, STATE char(2), COUNTY varchar, ZIP_CLASS varchar);
将数据从CSV文件复制到表格中:
\copy zip_codes FROM '/path/to/csv/ZIP_CODES.txt' DELIMITER ',' CSV
您还可以指定要读取的列:
\copy zip_codes(ZIP,CITY,STATE) FROM '/path/to/csv/ZIP_CODES.txt' DELIMITER ',' CSV
请勿将COPY与psql指令\ copy混淆。\ copy调用COPY FROM STDIN或COPY TO STDOUT,然后将数据提取/存储在psql客户端可访问的文件中。因此,使用\ copy时,文件的可访问性和访问权限取决于客户端而不是服务器。
并注意:
对于标识列,COPY FROM命令将始终写入输入数据中提供的列值,例如INSERT选项OVERRIDING SYSTEM VALUE。
COPY
,并\copy
不仅仅是权限得多,而且你不能简单地添加了``使它神奇的工作。请参阅此处的描述(在导出的上下文中):stackoverflow.com/a/1517692/157957
一种快速的实现方法是使用Python pandas库(版本0.15或更高版本效果最好)。这将为您创建列-尽管显然对数据类型所做的选择可能不是您想要的。如果不能完全满足您的要求,则可以始终使用作为模板生成的“创建表”代码。
这是一个简单的例子:
import pandas as pd
df = pd.read_csv('mypath.csv')
df.columns = [c.lower() for c in df.columns] #postgres doesn't like capitals or spaces
from sqlalchemy import create_engine
engine = create_engine('postgresql://username:password@localhost:5432/dbname')
df.to_sql("my_table_name", engine)
这是一些代码,向您展示如何设置各种选项:
# Set it so the raw sql output is logged
import logging
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)
df.to_sql("my_table_name2",
engine,
if_exists="append", #options are ‘fail’, ‘replace’, ‘append’, default ‘fail’
index=False, #Do not output the index of the dataframe
dtype={'col1': sqlalchemy.types.NUMERIC,
'col2': sqlalchemy.types.String}) #Datatypes should be [sqlalchemy types][1]
if_exists
可以将参数设置为替换或附加到现有表,例如df.to_sql("fhrs", engine, if_exists='replace')
您也可以使用pgAdmin,它提供了一个GUI来进行导入。这在此SO线程中显示。使用pgAdmin的优点是它也适用于远程数据库。
但是,与之前的解决方案非常相似,您将需要在数据库中拥有表。每个人都有自己的解决方案,但我通常要做的是在Excel中打开CSV,复制标题,将带有换位符的特殊内容粘贴在不同的工作表上,将相应的数据类型放在下一列中,然后将其复制并粘贴到文本编辑器中加上适当的SQL表创建查询,如下所示:
CREATE TABLE my_table (
/*paste data from Excel here for example ... */
col_1 bigint,
col_2 bigint,
/* ... */
col_n bigint
)
这里的大多数其他解决方案要求您事先/手动创建表。在某些情况下(例如,如果目标表中有很多列),这可能不切实际。因此,以下方法可能会派上用场。
提供csv文件的路径和列数,您可以使用以下函数将表加载到临时表中,该表将命名为 target_table
:
假定第一行具有列名。
create or replace function data.load_csv_file
(
target_table text,
csv_path text,
col_count integer
)
returns void as $$
declare
iter integer; -- dummy integer to iterate columns with
col text; -- variable to keep the column name at each iteration
col_first text; -- first column name, e.g., top left corner on a csv file or spreadsheet
begin
create table temp_table ();
-- add just enough number of columns
for iter in 1..col_count
loop
execute format('alter table temp_table add column col_%s text;', iter);
end loop;
-- copy the data from csv file
execute format('copy temp_table from %L with delimiter '','' quote ''"'' csv ', csv_path);
iter := 1;
col_first := (select col_1 from temp_table limit 1);
-- update the column names based on the first row which has the column names
for col in execute format('select unnest(string_to_array(trim(temp_table::text, ''()''), '','')) from temp_table where col_1 = %L', col_first)
loop
execute format('alter table temp_table rename column col_%s to %s', iter, col);
iter := iter + 1;
end loop;
-- delete the columns row
execute format('delete from temp_table where %s = %L', col_first, col_first);
-- change the temp table name to the name given as parameter, if not blank
if length(target_table) > 0 then
execute format('alter table temp_table rename to %I', target_table);
end if;
end;
$$ language plpgsql;
public
)
使用此SQL代码
copy table_name(atribute1,attribute2,attribute3...)
from 'E:\test.csv' delimiter ',' csv header
header关键字使DBMS知道csv文件具有带有属性的头
有关更多信息,请访问http://www.postgresqltutorial.com/import-csv-file-into-posgresql-table/
使用PostgreSQL的个人经验,仍在等待更快的方法。
1.如果文件存储在本地,则首先创建表框架:
drop table if exists ur_table;
CREATE TABLE ur_table
(
id serial NOT NULL,
log_id numeric,
proc_code numeric,
date timestamp,
qty int,
name varchar,
price money
);
COPY
ur_table(id, log_id, proc_code, date, qty, name, price)
FROM '\path\xxx.csv' DELIMITER ',' CSV HEADER;
2.当\ path \ xxx.csv在服务器上时,postgreSQL没有访问服务器的权限,您将必须通过内置的pgAdmin功能导入.csv文件。
右键单击表名称,选择导入。
如果仍有问题,请参考本教程。 http://www.postgresqltutorial.com/import-csv-file-into-posgresql-table/
如何将CSV文件数据导入PostgreSQL表?
脚步:
需要在终端中连接PostgreSQL数据库
psql -U postgres -h localhost
需要创建数据库
create database mydb;
需要创建用户
create user siva with password 'mypass';
与数据库连接
\c mydb;
需要创建架构
create schema trip;
需要创建表
create table trip.test(VendorID int,passenger_count int,trip_distance decimal,RatecodeID int,store_and_fwd_flag varchar,PULocationID int,DOLocationID int,payment_type decimal,fare_amount decimal,extra decimal,mta_tax decimal,tip_amount decimal,tolls_amount int,improvement_surcharge decimal,total_amount
);
将CSV文件数据导入到PostgreSQL
COPY trip.test(VendorID int,passenger_count int,trip_distance decimal,RatecodeID int,store_and_fwd_flag varchar,PULocationID int,DOLocationID int,payment_type decimal,fare_amount decimal,extra decimal,mta_tax decimal,tip_amount decimal,tolls_amount int,improvement_surcharge decimal,total_amount) FROM '/home/Documents/trip.csv' DELIMITER ',' CSV HEADER;
查找给定的表数据
select * from trip.test;
恕我直言,最方便的方法是使用csvkit中的csvsql遵循“将CSV数据导入到postgresql中,这是一种舒适的方法;-) ” ,这是一个可通过pip安装的python软件包。
在Python中,您可以使用以下代码通过列名称自动创建PostgreSQL表:
import pandas, csv
from io import StringIO
from sqlalchemy import create_engine
def psql_insert_copy(table, conn, keys, data_iter):
dbapi_conn = conn.connection
with dbapi_conn.cursor() as cur:
s_buf = StringIO()
writer = csv.writer(s_buf)
writer.writerows(data_iter)
s_buf.seek(0)
columns = ', '.join('"{}"'.format(k) for k in keys)
if table.schema:
table_name = '{}.{}'.format(table.schema, table.name)
else:
table_name = table.name
sql = 'COPY {} ({}) FROM STDIN WITH CSV'.format(table_name, columns)
cur.copy_expert(sql=sql, file=s_buf)
engine = create_engine('postgresql://user:password@localhost:5432/my_db')
df = pandas.read_csv("my.csv")
df.to_sql('my_table', engine, schema='my_schema', method=psql_insert_copy)
这也相对较快,我可以在大约4分钟的时间内导入超过330万行。
pgfutter有很多问题,我建议pgcsv。
这是使用pgcsv的方法:
sudo pip install pgcsv
pgcsv --db 'postgresql://localhost/postgres?user=postgres&password=...' my_table my_file.csv
如果您需要从文本/解析多行CSV导入的简单机制,则可以使用:
CREATE TABLE t -- OR INSERT INTO tab(col_names)
AS
SELECT
t.f[1] AS col1
,t.f[2]::int AS col2
,t.f[3]::date AS col3
,t.f[4] AS col4
FROM (
SELECT regexp_split_to_array(l, ',') AS f
FROM regexp_split_to_table(
$$a,1,2016-01-01,bbb
c,2,2018-01-01,ddd
e,3,2019-01-01,eee$$, '\n') AS l) t;
DBeaver Community Edition(dbeaver.io)使得连接数据库变得很简单,然后导入CSV文件以上传到PostgreSQL数据库。它还使发布查询,检索数据以及将结果集下载为CSV,JSON,SQL或其他常见数据格式变得容易。
它是面向SQL程序员,DBA和分析人员的FOSS多平台数据库工具,支持所有流行的数据库:MySQL,PostgreSQL,SQLite,Oracle,DB2,SQL Server,Sybase,MS Access,Teradata,Firebird,Hive,Presto等。它是TOAD for Postgres,TOAD for SQL Server或Toad for Oracle的可行的FOSS竞争对手。
我与DBeaver没有任何隶属关系。我喜欢这个价格(免费!)和功能齐全,但是我希望他们能更多地打开这个DBeaver / Eclipse应用程序,并轻松地向DBeaver / Eclipse中添加分析小部件,而不是要求用户仅支付199美元的年度订阅费用直接在应用程序内创建图形和图表。我的Java编码技能很生疏,我不想花数周的时间重新学习如何构建Eclipse窗口小部件,(只是发现DBeaver可能已禁用向DBeaver Community Edition添加第三方窗口小部件的功能。)
作为Java开发人员的DBeaver高级用户能否提供一些有关创建分析小部件以添加到DBeaver社区版的步骤的见解?
我创建了一个小工具,csv
可以很容易地将文件导入PostgreSQL,只需一个命令,它将创建并填充表,不幸的是,目前自动创建的所有字段都使用TEXT类型。
csv2pg users.csv -d ";" -H 192.168.99.100 -U postgres -B mydatabase
psql -h 192.168.99.100 -U postgres mydatabase -c "COPY users FROM 'users.csv' DELIMITER ';' CSV"
?我猜它创建表的那部分很好,但是由于每个字段都是文本,所以它不是超级有用