¿Cómo puedo escribir un procedimiento almacenado que importe datos de un archivo CSV y complete la tabla?
¿Cómo puedo escribir un procedimiento almacenado que importe datos de un archivo CSV y complete la tabla?
Respuestas:
Echa un vistazo a este breve artículo .
Solución parafraseada aquí:
Crea tu mesa:
CREATE TABLE zip_codes
(ZIP char(5), LATITUDE double precision, LONGITUDE double precision,
CITY varchar, STATE char(2), COUNTY varchar, ZIP_CLASS varchar);
Copie los datos de su archivo CSV a la tabla:
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
Si no tiene permiso para usar COPY
(que funciona en el servidor db), puede usar \copy
en su lugar (que funciona en el cliente db). Usando el mismo ejemplo que Bozhidar Batsov:
Crea tu mesa:
CREATE TABLE zip_codes
(ZIP char(5), LATITUDE double precision, LONGITUDE double precision,
CITY varchar, STATE char(2), COUNTY varchar, ZIP_CLASS varchar);
Copie los datos de su archivo CSV a la tabla:
\copy zip_codes FROM '/path/to/csv/ZIP_CODES.txt' DELIMITER ',' CSV
También puede especificar las columnas para leer:
\copy zip_codes(ZIP,CITY,STATE) FROM '/path/to/csv/ZIP_CODES.txt' DELIMITER ',' CSV
Consulte la documentación para COPIA :
No confunda COPY con la instrucción psql \ copy. \ copy invoca COPY FROM STDIN o COPY TO STDOUT, y luego recupera / almacena los datos en un archivo accesible para el cliente psql. Por lo tanto, la accesibilidad de los archivos y los derechos de acceso dependen del cliente en lugar del servidor cuando se usa \ copy.
y nota:
Para las columnas de identidad, el comando COPIAR DESDE siempre escribirá los valores de columna proporcionados en los datos de entrada, como la opción INSERTAR VALOR DE ANULACIÓN DEL SISTEMA.
COPY
y \copy
es mucho más que solo permisos, y no puede simplemente agregar un `` para que funcione mágicamente. Consulte la descripción (en el contexto de la exportación) aquí: stackoverflow.com/a/1517692/157957
Una forma rápida de hacerlo es con la biblioteca de pandas de Python (la versión 0.15 o superior funciona mejor). Esto manejará la creación de las columnas por usted, aunque obviamente las elecciones que hace para los tipos de datos podrían no ser lo que desea. Si no hace lo que quiere, siempre puede usar el código 'crear tabla' generado como plantilla.
Aquí hay un ejemplo simple:
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)
Y aquí hay un código que le muestra cómo configurar varias opciones:
# 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
parámetro se puede configurar para reemplazar o agregar a una tabla existente, por ejemplodf.to_sql("fhrs", engine, if_exists='replace')
df.to_sql()
es realmente lento, puedes usarlo d6tstack.utils.pd_to_psql()
desde d6tstack ver comparación de rendimiento
También puede usar pgAdmin, que ofrece una GUI para importar. Eso se muestra en este hilo SO . La ventaja de usar pgAdmin es que también funciona para bases de datos remotas.
Sin embargo, al igual que las soluciones anteriores, ya debería tener su tabla en la base de datos. Cada persona tiene su propia solución, pero lo que generalmente hago es abrir el archivo CSV en Excel, copiar los encabezados, pegar especiales con transposición en una hoja de trabajo diferente, colocar el tipo de datos correspondiente en la siguiente columna y luego copiarlo y pegarlo en un editor de texto junto con la consulta de creación de la tabla SQL adecuada de la siguiente manera:
CREATE TABLE my_table (
/*paste data from Excel here for example ... */
col_1 bigint,
col_2 bigint,
/* ... */
col_n bigint
)
La mayoría de las otras soluciones aquí requieren que cree la tabla por adelantado / manualmente. Esto puede no ser práctico en algunos casos (por ejemplo, si tiene muchas columnas en la tabla de destino). Entonces, el siguiente enfoque puede ser útil.
Al proporcionar la ruta y el recuento de columnas de su archivo csv, puede usar la siguiente función para cargar su tabla en una tabla temporal que se denominará como target_table
:
Se supone que la fila superior tiene los nombres de columna.
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
)
Como mencionó Paul, la importación funciona en pgAdmin:
haga clic derecho en la tabla -> importar
seleccionar archivo local, formato y codificación
Aquí hay una captura de pantalla alemana pgAdmin GUI:
algo similar que puede hacer con DbVisualizer (tengo una licencia, no estoy seguro acerca de la versión gratuita)
haga clic derecho en una tabla -> Importar datos de tabla ...
crear una tabla primero
Luego use el comando copiar para copiar los detalles de la tabla:
copie nombre_tabla (C1, C2, C3 ....)
de 'ruta a su archivo csv' delimitador ',' encabezado csv;
Gracias
Usa este código SQL
copy table_name(atribute1,attribute2,attribute3...)
from 'E:\test.csv' delimiter ',' csv header
la palabra clave de encabezado le permite al DBMS saber que el archivo csv tiene un encabezado con atributos
para más información visite http://www.postgresqltutorial.com/import-csv-file-into-posgresql-table/
Experiencia personal con PostgreSQL, aún esperando una forma más rápida.
1. Cree el esqueleto de la tabla primero si el archivo se almacena localmente:
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. Cuando \ path \ xxx.csv está en el servidor, postgreSQL no tiene permiso para acceder al servidor, deberá importar el archivo .csv a través de la funcionalidad integrada pgAdmin.
Haga clic derecho en el nombre de la tabla, elija importar.
Si aún tiene problemas, consulte este tutorial. http://www.postgresqltutorial.com/import-csv-file-into-posgresql-table/
¿Cómo importar datos de archivos CSV en una tabla PostgreSQL?
pasos:
Necesita conectar la base de datos postgresql en la terminal
psql -U postgres -h localhost
Necesito crear una base de datos
create database mydb;
Necesito crear usuario
create user siva with password 'mypass';
Conectar con la base de datos
\c mydb;
Necesito crear un esquema
create schema trip;
Necesito crear tabla
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
);
Importar datos de archivos csv a 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;
Encuentra los datos de la tabla dada
select * from trip.test;
En mi humilde opinión, la forma más conveniente es seguir " Importar datos CSV en postgresql, la forma cómoda ;-) ", utilizando csvsql de csvkit , que es un paquete de Python instalable a través de pip.
En Python, puede usar este código para la creación automática de tablas PostgreSQL con nombres de columna:
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)
También es relativamente rápido, puedo importar más de 3.3 millones de filas en aproximadamente 4 minutos.
Si necesita un mecanismo simple para importar texto / analizar CSV multilínea, puede usar:
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) hace que sea trivial conectarse a una base de datos, luego importar un archivo CSV para cargarlo en una base de datos PostgreSQL. También facilita la emisión de consultas, la recuperación de datos y la descarga de conjuntos de resultados a CSV, JSON, SQL u otros formatos de datos comunes.
Es una herramienta de base de datos multiplataforma FOSS para programadores SQL, DBA y analistas que admite todas las bases de datos populares: MySQL, PostgreSQL, SQLite, Oracle, DB2, SQL Server, Sybase, MS Access, Teradata, Firebird, Hive, Presto, etc. Es un competidor viable de FOSS para TOAD para Postgres, TOAD para SQL Server o Toad para Oracle.
No tengo afiliación con DBeaver. Me encanta el precio (¡GRATIS!) Y la funcionalidad completa, pero desearía que abrieran más esta aplicación DBeaver / Eclipse y facilitaran agregar widgets de análisis a DBeaver / Eclipse, en lugar de exigir a los usuarios que paguen la suscripción anual de $ 199 solo para crear gráficos y cuadros directamente dentro de la aplicación. Mis habilidades de codificación de Java están oxidadas y no tengo ganas de tomarme semanas para volver a aprender a construir widgets de Eclipse (solo para descubrir que DBeaver probablemente ha deshabilitado la capacidad de agregar widgets de terceros a DBeaver Community Edition).
¿Pueden los usuarios avanzados de DBeaver que son desarrolladores de Java proporcionar alguna información sobre los pasos para crear widgets de análisis para agregar a la Edición comunitaria de DBeaver?
Cree una tabla y tenga las columnas necesarias que se utilizan para crear la tabla en el archivo csv.
Abra postgres y haga clic derecho en la tabla de destino que desea cargar y seleccione importar y actualice los siguientes pasos en la sección de opciones de archivo
Ahora busque su archivo en nombre de archivo
Seleccione csv en formato
Codificación como ISO_8859_5
Ahora ir a misceláneos opciones y verifique el encabezado y haga clic en importar.
Creé una pequeña herramienta que importa csv
archivos en PostgreSQL súper fácil, solo un comando y creará y completará las tablas, desafortunadamente, en este momento, todos los campos creados automáticamente usan el tipo TEXT
csv2pg users.csv -d ";" -H 192.168.99.100 -U postgres -B mydatabase
La herramienta se puede encontrar en https://github.com/eduardonunesp/csv2pg
psql -h 192.168.99.100 -U postgres mydatabase -c "COPY users FROM 'users.csv' DELIMITER ';' CSV"
? Supongo que la parte donde crea la tabla es agradable, pero como cada campo es texto, no es súper útil