Làm cách nào tôi có thể viết một quy trình được lưu trữ để nhập dữ liệu từ tệp CSV và điền vào bảng?
Làm cách nào tôi có thể viết một quy trình được lưu trữ để nhập dữ liệu từ tệp CSV và điền vào bảng?
Câu trả lời:
Hãy xem bài viết ngắn này .
Giải pháp diễn giải ở đây:
Tạo bảng của bạn:
CREATE TABLE zip_codes
(ZIP char(5), LATITUDE double precision, LONGITUDE double precision,
CITY varchar, STATE char(2), COUNTY varchar, ZIP_CLASS varchar);
Sao chép dữ liệu từ tệp CSV của bạn vào bảng:
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
Nếu bạn không có quyền sử dụng COPY
(hoạt động trên máy chủ db), bạn có thể sử dụng \copy
thay thế (hoạt động trong máy khách db). Sử dụng ví dụ tương tự như Bozhidar Batsov:
Tạo bảng của bạn:
CREATE TABLE zip_codes
(ZIP char(5), LATITUDE double precision, LONGITUDE double precision,
CITY varchar, STATE char(2), COUNTY varchar, ZIP_CLASS varchar);
Sao chép dữ liệu từ tệp CSV của bạn vào bảng:
\copy zip_codes FROM '/path/to/csv/ZIP_CODES.txt' DELIMITER ',' CSV
Bạn cũng có thể chỉ định các cột để đọc:
\copy zip_codes(ZIP,CITY,STATE) FROM '/path/to/csv/ZIP_CODES.txt' DELIMITER ',' CSV
Xem tài liệu về COPY :
Đừng nhầm lẫn COPY với hướng dẫn psql \ copy. \ copy gọi COPY TỪ STDIN hoặc SAO CHÉP sang STDOUT, sau đó tìm nạp / lưu trữ dữ liệu trong một tệp có thể truy cập vào máy khách psql. Do đó, quyền truy cập tệp và quyền truy cập tùy thuộc vào máy khách thay vì máy chủ khi \ copy được sử dụng.
và lưu ý:
Đối với các cột định danh, lệnh COPY TỪ sẽ luôn ghi các giá trị cột được cung cấp trong dữ liệu đầu vào, giống như tùy chọn INSERT QUÁ TRÌNH GIÁ TRỊ HỆ THỐNG.
COPY
và \copy
không chỉ là các quyền và bạn không thể thêm một `` để làm cho nó hoạt động một cách kỳ diệu. Xem mô tả (trong ngữ cảnh xuất khẩu) tại đây: stackoverflow.com/a/1517692/157957
Một cách nhanh chóng để làm điều này là với thư viện gấu trúc Python (phiên bản 0.15 trở lên hoạt động tốt nhất). Điều này sẽ xử lý việc tạo các cột cho bạn - mặc dù rõ ràng các lựa chọn mà nó đưa ra cho các kiểu dữ liệu có thể không phải là điều bạn muốn. Nếu nó không hoàn toàn làm những gì bạn muốn, bạn luôn có thể sử dụng mã 'tạo bảng' được tạo làm mẫu.
Đây là một ví dụ đơn giản:
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)
Và đây là một số mã chỉ cho bạn cách đặt các tùy chọn khác nhau:
# 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
thông số có thể được thiết lập để thay thế hoặc append vào một bảng hiện có, ví dụdf.to_sql("fhrs", engine, if_exists='replace')
df.to_sql()
thực sự rất chậm, bạn có thể sử dụng d6tstack.utils.pd_to_psql()
từ d6tstack xem so sánh hiệu suất
Bạn cũng có thể sử dụng pgAdmin, cung cấp GUI để thực hiện nhập. Điều đó được thể hiện trong chủ đề SO này . Ưu điểm của việc sử dụng pgAdmin là nó cũng hoạt động cho các cơ sở dữ liệu từ xa.
Giống như các giải pháp trước đây, bạn sẽ cần phải có bảng trên cơ sở dữ liệu. Mỗi người có giải pháp riêng nhưng những gì tôi thường làm là mở CSV trong Excel, sao chép các tiêu đề, dán đặc biệt với chuyển vị trên một bảng tính khác nhau, đặt loại dữ liệu tương ứng trên cột tiếp theo, sau đó chỉ cần sao chép và dán nó vào trình soạn thảo văn bản cùng với truy vấn tạo bảng SQL thích hợp như vậy:
CREATE TABLE my_table (
/*paste data from Excel here for example ... */
col_1 bigint,
col_2 bigint,
/* ... */
col_n bigint
)
Hầu hết các giải pháp khác ở đây yêu cầu bạn tạo bảng trước / thủ công. Điều này có thể không thực tế trong một số trường hợp (ví dụ: nếu bạn có nhiều cột trong bảng đích). Vì vậy, cách tiếp cận dưới đây có thể có ích.
Cung cấp đường dẫn và số cột của tệp csv của bạn, bạn có thể sử dụng hàm sau để tải bảng của mình vào bảng tạm thời sẽ được đặt tên là target_table
:
Hàng trên cùng được giả sử có tên cột.
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
:)
Như Paul đã đề cập, nhập hoạt động trong pgAdmin:
nhấp chuột phải vào bảng -> nhập
chọn tập tin cục bộ, định dạng và mã hóa
đây là ảnh chụp màn hình GUI pgAdmin của Đức:
điều tương tự bạn có thể làm với DbVisualizer (tôi có giấy phép, không chắc chắn về phiên bản miễn phí)
nhấp chuột phải vào bảng -> Nhập dữ liệu bảng ...
tạo bảng trước
Sau đó sử dụng lệnh sao chép để sao chép chi tiết bảng:
sao chép tên_bảng (C1, C2, C3 ....)
từ 'đường dẫn đến tệp csv của bạn' dấu phân cách ',' tiêu đề csv;
Cảm ơn
Sử dụng mã SQL này
copy table_name(atribute1,attribute2,attribute3...)
from 'E:\test.csv' delimiter ',' csv header
từ khóa tiêu đề cho DBMS biết rằng tệp csv có tiêu đề với các thuộc tính
để biết thêm chuyến thăm http://www.postgresqltutorial.com/import-csv-file-into-posegresql-table/
Trải nghiệm cá nhân với PostgreSQL, vẫn đang chờ một cách nhanh hơn.
1. Tạo khung xương đầu tiên nếu tệp được lưu trữ cục bộ:
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. Khi \ path \ xxx.csv ở trên máy chủ, postgreSQL không có quyền truy cập vào máy chủ, bạn sẽ phải nhập tệp .csv thông qua chức năng pgAdmin được tích hợp.
Nhấp chuột phải vào tên bảng chọn nhập.
Nếu bạn vẫn có vấn đề, xin vui lòng tham khảo hướng dẫn này. http://www.postgresqltutorial.com/import-csv-file-into-posegresql-table/
Làm cách nào để nhập dữ liệu tệp CSV vào bảng PostgreSQL?
các bước:
Cần kết nối cơ sở dữ liệu postgresql trong terminal
psql -U postgres -h localhost
Cần tạo cơ sở dữ liệu
create database mydb;
Cần tạo người dùng
create user siva with password 'mypass';
Kết nối với cơ sở dữ liệu
\c mydb;
Cần tạo lược đồ
create schema trip;
Cần tạo bảng
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
);
Nhập dữ liệu tệp csv vào 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;
Tìm dữ liệu bảng đã cho
select * from trip.test;
IMHO, cách thuận tiện nhất là theo dõi " Nhập dữ liệu CSV vào postgresql, cách thoải mái ;-) ", sử dụng csvsql từ csvkit , đây là gói python có thể cài đặt qua pip.
Trong Python, bạn có thể sử dụng mã này để tạo bảng PostgreSQL tự động với tên cột:
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)
Nó cũng tương đối nhanh, tôi có thể nhập hơn 3,3 triệu hàng trong khoảng 4 phút.
Nếu bạn cần cơ chế đơn giản để nhập từ CSV đa văn bản / phân tích cú pháp, bạn có thể sử dụng:
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) khiến việc kết nối với cơ sở dữ liệu trở nên tầm thường, sau đó nhập tệp CSV để tải lên cơ sở dữ liệu PostgreQuery. Nó cũng giúp bạn dễ dàng đưa ra các truy vấn, truy xuất dữ liệu và tải xuống các tập kết quả thành CSV, JSON, SQL hoặc các định dạng dữ liệu phổ biến khác.
Nó là một công cụ cơ sở dữ liệu đa nền tảng FOSS dành cho các lập trình viên SQL, DBA và nhà phân tích hỗ trợ tất cả các cơ sở dữ liệu phổ biến: MySQL, PostgreQuery, SQLite, Oracle, DB2, SQL Server, Sybase, MS Access, Teradata, Firebird, Hive, Presto, v.v. Đây là đối thủ cạnh tranh FOSS khả thi với TOAD cho Postgres, TOAD cho SQL Server hoặc Toad cho Oracle.
Tôi không có liên kết với DBeaver. Tôi yêu giá (MIỄN PHÍ!) Và đầy đủ chức năng, nhưng tôi ước họ sẽ mở ứng dụng DBeaver / Eclipse này nhiều hơn và giúp dễ dàng thêm các tiện ích phân tích vào DBeaver / Eclipse, thay vì chỉ yêu cầu người dùng trả tiền cho đăng ký hàng năm $ 199 để tạo đồ thị và biểu đồ trực tiếp trong ứng dụng. Các kỹ năng mã hóa Java của tôi rất yếu và tôi không cảm thấy mất nhiều tuần để học cách xây dựng các widget Eclipse, (chỉ để thấy rằng DBeaver có thể đã vô hiệu hóa khả năng thêm các widget của bên thứ ba vào DBeaver Community Edition.)
Người dùng DBeaver có thể cung cấp năng lượng cho các nhà phát triển Java có thể cung cấp một số thông tin chi tiết về các bước để tạo các tiện ích phân tích để thêm vào Phiên bản Cộng đồng của DBeaver không?
Tạo bảng và có các cột bắt buộc được sử dụng để tạo bảng trong tệp csv.
Mở postgres và nhấp chuột phải vào bảng đích mà bạn muốn tải và chọn nhập và Cập nhật các bước sau trong phần tùy chọn tệp
Bây giờ duyệt tập tin của bạn trong tên tệp
Chọn csv ở định dạng
Mã hóa thành ISO_8859_5
Bây giờ goto Misc. tùy chọn và kiểm tra tiêu đề và nhấp vào nhập khẩu.
Tôi đã tạo một công cụ nhỏ để nhập csv
tệp vào PostgreSQL siêu dễ dàng, chỉ cần một lệnh và nó sẽ tạo và điền vào các bảng, thật không may, tại thời điểm tất cả các trường được tạo tự động sử dụng kiểu văn bản
csv2pg users.csv -d ";" -H 192.168.99.100 -U postgres -B mydatabase
Công cụ này có thể được tìm thấy trên https://github.com/eduardonunesp/csv2pg
psql -h 192.168.99.100 -U postgres mydatabase -c "COPY users FROM 'users.csv' DELIMITER ';' CSV"
? Tôi đoán phần mà nó tạo ra bảng là tốt, nhưng vì mọi trường đều là văn bản nên nó không siêu hữu ích