Saya ingin menyalin file CSV ke tabel Postgres. Ada sekitar 100 kolom dalam tabel ini, jadi saya tidak ingin menulis ulang jika tidak perlu.
Saya menggunakan \copy table from 'table.csv' delimiter ',' csv;
perintah tetapi tanpa tabel yang dibuat saya dapatkan ERROR: relation "table" does not exist
. Jika saya menambahkan tabel kosong, saya tidak mendapatkan kesalahan, tetapi tidak ada yang terjadi. Saya mencoba perintah ini dua atau tiga kali dan tidak ada output atau pesan, tetapi tabel tidak diperbarui ketika saya memeriksanya melalui PGAdmin.
Apakah ada cara untuk mengimpor tabel dengan tajuk yang disertakan seperti yang saya coba lakukan?
postgresql
csv
postgresql-copy
Piala Stanley Phil
sumber
sumber
table
? Sangat membingungkan. Apakah tabel ada, atau Anda ingin membuatnya berdasarkan CSV? (Anda tidak bisa)\copy table(column1, column2, ...) from 'table.csv' delimiter ',' csv;
dengan tidak berhasil. Idealnya, tabel dapat dibuat melalui CSV saja, dan menggunakan header di file itu.Jawaban:
Ini berhasil. Baris pertama memiliki nama kolom di dalamnya.
sumber
COPY
tidak membuat tabel atau menambahkan kolom ke dalamnya, ia menambahkan baris ke tabel yang sudah ada dengan kolom yang sudah ada. Agaknya penanya ingin mengotomatiskan pembuatan ~ 100 kolom, danCOPY
tidak memiliki fungsi ini, setidaknya pada PG 9.3.ADD
data.syntax error at or near "HEADER" LINE 2: delimiter ',' CSV HEADER
pada aws pergeseran merah.Dengan pustaka Python
pandas
, Anda dapat dengan mudah membuat nama kolom dan menyimpulkan tipe data dari file csv.The
if_exists
Parameter dapat diatur untuk mengganti atau append ke tabel yang ada, misalnyadf.to_sql('pandas_db', engine, if_exists='replace')
. Ini juga berfungsi untuk jenis file masukan tambahan, dokumen di sini dan di sini .sumber
pd.read_excel
, bukanpd.read_csv
. Saya memperbarui jawabannya.df.to_sql()
SANGAT LAMBAT, untuk mempercepatnya anda bisa menggunakan d6tstack . Ini juga menangani perubahan skema.Alternatif dengan terminal tanpa izin
The pg dokumentasi di CATATAN katakanlah
Jadi, secara keseluruhan, menggunakan
psql
atau klien apapun, bahkan di server lokal, Anda memiliki masalah ... Dan, jika Anda mengekspresikan perintah COPY untuk pengguna lain, mis. di README Github, pembaca akan mengalami masalah ...Satu-satunya cara untuk mengekspresikan jalur relatif dengan izin klien menggunakan STDIN ,
seperti yang diingat di sini :
psql -h remotehost -d remote_mydb -U myuser -c \ "copy mytable (column1, column2) from STDIN with delimiter as ','" \ < ./relative_path/file.csv
sumber
Saya telah menggunakan fungsi ini untuk beberapa waktu tanpa masalah. Anda hanya perlu memberikan kolom angka yang ada di file csv, dan itu akan mengambil nama header dari baris pertama dan membuat tabel untuk Anda:
create or replace function data.load_csv_file ( target_table text, -- name of the table that will be created csv_file_path text, col_count integer ) returns void as $$ declare iter integer; -- dummy integer to iterate columns with col text; -- to keep column names in each iteration col_first text; -- first column name, e.g., top left corner on a csv file or spreadsheet begin set schema 'data'; 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_file_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 // using quote_ident or %I does not work here!? 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;
sumber
set schema 'data';
apa pun yang terjadi untuk AndaAnda dapat menggunakan d6tstack yang membuat tabel untuk Anda dan lebih cepat daripada pd.to_sql () karena menggunakan perintah impor DB asli. Ini mendukung Postgres serta MYSQL dan MS SQL.
Ini juga berguna untuk mengimpor beberapa CSV, menyelesaikan perubahan skema data dan / atau praproses dengan panda (misalnya untuk tanggal) sebelum menulis ke db, lihat lebih jauh di buku catatan contoh
sumber