Bagaimana saya bisa menulis prosedur tersimpan yang mengimpor data dari file CSV dan mengisi tabel?
Bagaimana saya bisa menulis prosedur tersimpan yang mengimpor data dari file CSV dan mengisi tabel?
Jawaban:
Lihatlah artikel singkat ini .
Solusi diparafrasekan di sini:
Buat meja Anda:
CREATE TABLE zip_codes
(ZIP char(5), LATITUDE double precision, LONGITUDE double precision,
CITY varchar, STATE char(2), COUNTY varchar, ZIP_CLASS varchar);
Salin data dari file CSV Anda ke tabel:
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
Jika Anda tidak memiliki izin untuk menggunakan COPY
(yang berfungsi pada server db), Anda dapat menggunakan \copy
sebagai gantinya (yang bekerja di klien db). Menggunakan contoh yang sama dengan Bozhidar Batsov:
Buat meja Anda:
CREATE TABLE zip_codes
(ZIP char(5), LATITUDE double precision, LONGITUDE double precision,
CITY varchar, STATE char(2), COUNTY varchar, ZIP_CLASS varchar);
Salin data dari file CSV Anda ke tabel:
\copy zip_codes FROM '/path/to/csv/ZIP_CODES.txt' DELIMITER ',' CSV
Anda juga dapat menentukan kolom untuk dibaca:
\copy zip_codes(ZIP,CITY,STATE) FROM '/path/to/csv/ZIP_CODES.txt' DELIMITER ',' CSV
Lihat dokumentasi untuk COPY :
Jangan bingung COPY dengan instruksi psql \ copy. \ copy meminta COPY DARI STDIN atau COPY TO STDOUT, dan kemudian mengambil / menyimpan data dalam file yang dapat diakses oleh klien psql. Dengan demikian, aksesibilitas file dan hak akses bergantung pada klien daripada server ketika \ copy digunakan.
dan perhatikan:
Untuk kolom identitas, perintah COPY FROM akan selalu menulis nilai kolom yang disediakan dalam data input, seperti opsi INSERT OVERRIDING SYSTEM VALUE.
COPY
dan \copy
lebih dari sekadar izin, dan Anda tidak bisa begitu saja menambahkan `` untuk membuatnya berfungsi secara ajaib. Lihat deskripsi (dalam konteks ekspor) di sini: stackoverflow.com/a/1517692/157957
Salah satu cara cepat untuk melakukan ini adalah dengan panda Python library (versi 0.15 atau di atas yang terbaik). Ini akan menangani pembuatan kolom untuk Anda - meskipun jelas pilihan yang dibuat untuk tipe data mungkin bukan yang Anda inginkan. Jika tidak cukup melakukan apa yang Anda inginkan, Anda selalu dapat menggunakan kode 'buat tabel' yang dihasilkan sebagai templat.
Berikut ini contoh sederhana:
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)
Dan inilah beberapa kode yang menunjukkan kepada Anda cara mengatur berbagai opsi:
# 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
parameter dapat diatur untuk mengganti atau menambahkan ke tabel yang ada, misalnyadf.to_sql("fhrs", engine, if_exists='replace')
df.to_sql()
sangat lambat, Anda dapat menggunakan d6tstack.utils.pd_to_psql()
dari d6tstack melihat perbandingan kinerja
Anda juga dapat menggunakan pgAdmin, yang menawarkan GUI untuk melakukan impor. Itu ditampilkan di utas SO ini . Keuntungan menggunakan pgAdmin adalah ia juga berfungsi untuk basis data jauh.
Sama seperti solusi sebelumnya, Anda harus sudah memiliki tabel di database. Setiap orang memiliki solusi sendiri tetapi yang biasanya saya lakukan adalah membuka CSV di Excel, menyalin tajuk, menempelkan khusus dengan transposisi pada lembar kerja yang berbeda, tempatkan tipe data yang sesuai di kolom berikutnya kemudian salin dan tempel ke editor teks bersama dengan kueri pembuatan tabel SQL yang sesuai seperti:
CREATE TABLE my_table (
/*paste data from Excel here for example ... */
col_1 bigint,
col_2 bigint,
/* ... */
col_n bigint
)
Sebagian besar solusi lain di sini mengharuskan Anda membuat tabel terlebih dahulu / secara manual. Ini mungkin tidak praktis dalam beberapa kasus (misalnya, jika Anda memiliki banyak kolom di tabel tujuan). Jadi, pendekatan di bawah ini mungkin berguna.
Menyediakan jumlah lintasan dan kolom file csv Anda, Anda dapat menggunakan fungsi berikut untuk memuat tabel Anda ke tabel temp yang akan dinamai sebagai target_table
:
Baris atas diasumsikan memiliki nama kolom.
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
)
Seperti yang disebutkan Paul, impor berfungsi di pgAdmin:
klik kanan pada tabel -> impor
pilih file, format, dan pengkodean lokal
di sini adalah tangkapan layar pgAdmin Jerman:
hal serupa dapat Anda lakukan dengan DbVisualizer (Saya punya lisensi, tidak yakin tentang versi gratis)
klik kanan pada tabel -> Impor Data Tabel ...
buat tabel terlebih dahulu
Kemudian gunakan perintah salin untuk menyalin detail tabel:
salin table_name (C1, C2, C3 ....)
dari 'path ke file csv Anda' pembatas ',' header csv;
Terima kasih
Gunakan kode SQL ini
copy table_name(atribute1,attribute2,attribute3...)
from 'E:\test.csv' delimiter ',' csv header
kata kunci header membuat DBMS tahu bahwa file csv memiliki header dengan atribut
untuk lebih lanjut kunjungi http://www.postgresqltutorial.com/import-csv-file-into-posgresql-table/
Pengalaman pribadi dengan PostgreSQL, masih menunggu cara yang lebih cepat.
1. Buat kerangka tabel terlebih dahulu jika file disimpan secara lokal:
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. Ketika \ path \ xxx.csv ada di server, postgreSQL tidak memiliki izin untuk mengakses server, Anda harus mengimpor file .csv melalui fungsionalitas bawaan pgAdmin.
Klik kanan nama tabel pilih impor.
Jika Anda masih memiliki masalah, silakan merujuk tutorial ini. http://www.postgresqltutorial.com/import-csv-file-into-posgresql-table/
Bagaimana cara mengimpor data file CSV ke tabel PostgreSQL?
Langkah:
Perlu menghubungkan database postgresql di terminal
psql -U postgres -h localhost
Perlu membuat basis data
create database mydb;
Perlu membuat pengguna
create user siva with password 'mypass';
Terhubung dengan basis data
\c mydb;
Perlu membuat skema
create schema trip;
Perlu membuat tabel
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
);
Impor data file csv ke 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;
Temukan data tabel yang diberikan
select * from trip.test;
IMHO, cara paling mudah adalah mengikuti " Impor data CSV ke postgresql, cara yang nyaman ;-) ", menggunakan csvsql dari csvkit , yang merupakan paket python yang dapat diinstal melalui pip.
Dengan Python, Anda dapat menggunakan kode ini untuk pembuatan tabel PostgreSQL otomatis dengan nama kolom:
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)
Ini juga relatif cepat, saya dapat mengimpor lebih dari 3,3 juta baris dalam waktu sekitar 4 menit.
Jika Anda memerlukan mekanisme sederhana untuk mengimpor dari teks / parsing CSV multiline, Anda dapat menggunakan:
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) membuatnya mudah untuk terhubung ke database, lalu mengimpor file CSV untuk diunggah ke database PostgreSQL. Ini juga memudahkan untuk mengeluarkan kueri, mengambil data, dan mengunduh set hasil ke CSV, JSON, SQL, atau format data umum lainnya.
Ini adalah alat database multi-platform FOSS untuk pemrogram SQL, DBA, dan analis yang mendukung semua basis data populer: MySQL, PostgreSQL, SQLite, Oracle, DB2, SQL Server, Sybase, MS Access, Teradata, Firebird, Hive, Presto, dll. Ini adalah pesaing FOSS yang layak untuk TOAD untuk Postgres, TOAD untuk SQL Server, atau Toad untuk Oracle.
Saya tidak memiliki afiliasi dengan DBeaver. Saya suka harga (GRATIS!) Dan fungsionalitas penuh, tetapi saya berharap mereka akan membuka aplikasi DBeaver / Eclipse ini lebih banyak dan membuatnya mudah untuk menambahkan widget analitik ke DBeaver / Eclipse, daripada meminta pengguna untuk membayar langganan tahunan $ 199 hanya untuk membuat grafik dan grafik langsung di dalam aplikasi. Keterampilan pengkodean Java saya berkarat dan saya tidak ingin menghabiskan waktu berminggu-minggu untuk mempelajari kembali cara membuat widget Eclipse, (hanya untuk mengetahui bahwa DBeaver mungkin telah menonaktifkan kemampuan untuk menambahkan widget pihak ketiga ke dalam DBeaver Community Edition.)
Bisakah DBeaver memberi pengguna daya yang merupakan pengembang Java memberikan beberapa wawasan tentang langkah-langkah untuk membuat widget analitik untuk ditambahkan ke dalam Edisi Komunitas DBeaver?
Buat tabel dan memiliki kolom yang diperlukan yang digunakan untuk membuat tabel dalam file csv.
Buka postgres dan klik kanan pada tabel target yang ingin Anda muat & pilih impor dan Perbarui langkah-langkah berikut di bagian opsi file
Sekarang telusuri file Anda dalam nama file
Pilih csv dalam format
Pengkodean sebagai ISO_8859_5
Sekarang kebagian misc. opsi dan periksa tajuk dan klik impor.
Saya membuat alat kecil yang mengimpor csv
file ke PostgreSQL super mudah, hanya sebuah perintah dan itu akan membuat dan mengisi tabel, sayangnya, saat ini semua bidang yang dibuat secara otomatis menggunakan jenis TEXT
csv2pg users.csv -d ";" -H 192.168.99.100 -U postgres -B mydatabase
Alat ini dapat ditemukan di https://github.com/eduardonunesp/csv2pg
psql -h 192.168.99.100 -U postgres mydatabase -c "COPY users FROM 'users.csv' DELIMITER ';' CSV"
? Saya kira bagian di mana ia menciptakan tabel itu bagus, tetapi karena setiap bidang adalah teks, itu tidak berguna