Chcę skopiować plik CSV do tabeli Postgres. W tej tabeli jest około 100 kolumn, więc nie chcę ich przepisywać, jeśli nie muszę.
Używam \copy table from 'table.csv' delimiter ',' csv;
polecenia, ale bez utworzonej tabeli otrzymuję ERROR: relation "table" does not exist
. Jeśli dodam pustą tabelę, nie pojawia się żaden błąd, ale nic się nie dzieje. Próbowałem tego polecenia dwa lub trzy razy i nie było żadnych danych wyjściowych ani komunikatów, ale tabela nie została zaktualizowana, gdy sprawdzałem ją przez PGAdmin.
Czy istnieje sposób zaimportowania tabeli z dołączonymi nagłówkami, tak jak próbuję to zrobić?
postgresql
csv
postgresql-copy
Puchar Stanleya Phil
źródło
źródło
table
? Bardzo mylące. Czy tabela istnieje, czy chcesz ją utworzyć na podstawie pliku CSV? (nie możesz)\copy table(column1, column2, ...) from 'table.csv' delimiter ',' csv;
bez powodzenia. W idealnym przypadku tabelę można by utworzyć za pomocą samego pliku CSV i użyć nagłówków w tym pliku.Odpowiedzi:
To zadziałało. Pierwszy wiersz zawierał nazwy kolumn.
źródło
COPY
nie tworzy tabeli ani nie dodaje do niej kolumn, dodaje wiersze do istniejącej tabeli z istniejącymi kolumnami. Przypuszczalnie pytający chce zautomatyzować tworzenie ~ 100 kolumn iCOPY
nie ma takiej funkcjonalności, przynajmniej od wersji PG 9.3.ADD
dane.syntax error at or near "HEADER" LINE 2: delimiter ',' CSV HEADER
aws przesunięcie ku czerwieni.Dzięki bibliotece Python
pandas
możesz łatwo tworzyć nazwy kolumn i wywnioskować typy danych z pliku csv.if_exists
Parametr można ustawić, aby zastąpić lub dołączyć do istniejącej tabeli, npdf.to_sql('pandas_db', engine, if_exists='replace')
. Działa to również w przypadku dodatkowych typów plików wejściowych, dokumenty tutaj i tutaj .źródło
pd.read_excel
zamiast tego wpisałempd.read_csv
. Zaktualizowałem odpowiedź.df.to_sql()
jest BARDZO WOLNE, aby to przyspieszyć, możesz użyć d6tstack . Dba również o zmiany schematów.Alternatywnie przez terminal bez pozwolenia
Dokumentacja pg w NOTES say
Więc gerally, używając
psql
lub dowolnego klienta, nawet na lokalnym serwerze, masz problemy ... A jeśli używasz polecenia COPY dla innych użytkowników, np. w Github README czytelnik będzie miał problemy ...Jedynym sposobem wyrażenia ścieżki względnej z uprawnieniami klienta jest użycie STDIN ,
jak zapamiętano tutaj :
psql -h remotehost -d remote_mydb -U myuser -c \ "copy mytable (column1, column2) from STDIN with delimiter as ','" \ < ./relative_path/file.csv
źródło
Używam tej funkcji od jakiegoś czasu bez żadnych problemów. Wystarczy podać liczbę kolumn znajdujących się w pliku csv, a nazwy nagłówków z pierwszego wiersza zostaną utworzone dla Ciebie:
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;
źródło
set schema 'data';
tego, co jest dla CiebieMożesz użyć d6tstack który tworzy tabelę za Ciebie i jest szybszy niż pd.to_sql (), ponieważ używa natywnych poleceń importu DB. Obsługuje Postgres, a także MYSQL i MS SQL.
Jest również przydatny do importowania wielu plików CSV, rozwiązywania zmian w schemacie danych i / lub przetwarzania wstępnego za pomocą pand (np. Dat) przed zapisaniem do bazy danych, patrz dalej w przykładach notatnik
źródło