PostgreSQL - Cargar desde un CSV

 
Vista:
sin imagen de perfil
Val: 2
Ha aumentado su posición en 5 puestos en PostgreSQL (en relación al último mes)
Gráfica de PostgreSQL

Cargar desde un CSV

Publicado por Daniel (1 intervención) el 16/12/2020 21:09:15
Hola Amigos,
Llevo peleando con esto un par de dias y no se como masticarlo, os pongo en situacion, esta son las tablas en cuestion:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE TYPE direccion AS (
    calle varchar(50),
    nro varchar(5),
    bloque char(1),
    letra char(1),
    piso varchar(15),
    puerta varchar(3),
    cp varchar(6),
    ciudad varchar(50),
    prov varchar(50),
    pais char(2)
);
 
CREATE TABLE personas(
    id SERIAL,
    dni VARCHAR(12),
    nombres VARCHAR(50),
    apellidos VARCHAR(50),
    telefono VARCHAR(12),
    mail varchar(150),
    dir direccion
);

Tengo creado un tipo llamado direccion y una tabla personas que usa esa relacion.
Para insertar datos mediante la clausula INSERT esta todo perfecto y claro. El problema viene cuando intento ingresar los datos desde un archivo CSV, mi archivo CSV tiene el siguiente formato:
1
2
3
4
5
6
7
8
9
10
DNI,NOMBRE,APELLIDO,TEELEFONO,MAIL,CALLE,NRO,PISO,PUERTA,CIUDAD,PROVINCIA,PAIS
 
47795458D,CATERINA,ABRIL PALMA,639464078,,CALLE  SET,21, BAJO,,CORBERA DE LLOBREGAT,BARCELONA,ES
49895133Z,NISAR,AHMED RAJA,606280948,,CALLE  JACINT VERDAGUER,48, BAJO,,SANT JOAN DESPI,BARCELONA,ES
41093191B,JUAN,AIXALA BRUNA,664573553,,CALLE  MIGJORN,91, BAJO,,VALLIRANA,BARCELONA,ES
25443506D,MERCEDES,ALBAREDA NAGUILA,696113300,,CALLE  ARAGO,199,2,2,BARCELONA,BARCELONA,ES
46224778E,ANTONIO,ALMIRALL LLOPART,609476634,,CALLE  TORREBLANCA,10, BAJO,2,SANT JOAN DESPI,BARCELONA,ES
52363749V,ANGELES,ALONSO-MISOL GERLACHE,610438379,,CALLE  CASANOVA,110,3,1,BARCELONA,BARCELONA,ES
37794545W,SOLEDAD,AMEZCUA VILLA,655857934,,CALLE  TARRAGONA,22, BAJO,,PALLEJA,BARCELONA,ES
46562593J,CARLES ANDRES,ANDRES OLLE,610758714,,CALLE  SEPULVEDA,46,4,4,BARCELONA,BARCELONA,ES
Pongo el encabexado para que veais las columnas, pero en mi archivo clientes.csv no existe.

he intentado insertar los datos asi:
1
2
3
4
5
6
7
8
Prueba 1:
COPY cliente(dni, nombres, apellidos, telefono, mail, dir.calle, dir.nro, dir.piso, dir.puerta, dir.ciudad, dir.prov, dir.pais) FROM '/home/datos/personas.csv' DELIMITER ',';
 
Prueba 2:
COPY cliente(dni, nombres, apellidos, telefono, mail, (dir).calle, (dir).nro, (dir).piso, (dir).puerta, (dir).ciudad, (dir).prov, (dir).pais) FROM '/home/datos/personas.csv' DELIMITER ',';
 
Prueba 3:
COPY cliente(dni, nombres, apellidos, telefono, mail, row(calle, nro, piso, puerta, ciudad, prov, pais)) FROM '/home/datos/personas.csv' DELIMITER ',';

Pero en todos los caso me salta error.
Si no uso un tipo compuesto como dir, o sea los campos individuales en la tabla funciona perfecto, pero con el campo compuesto no encuentro la manera de hacerlo.

Alguien podría darme algo de luz?

Desde ya muchas Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Francisco
Val: 256
Oro
Ha mantenido su posición en PostgreSQL (en relación al último mes)
Gráfica de PostgreSQL

Cargar desde un CSV

Publicado por Francisco (110 intervenciones) el 11/02/2021 19:57:13
Hola

Tienes que indicarle el formato correcto, adicionalmente debes indicar que valores se transforman al tipo direccion encerrando entre comillas dobles y parentesis, tambien simplfique un poco para que el ejemplo fuera mas claro.

1
2
3
4
5
6
7
8
47795458D,CATERINA,ABRIL PALMA,639464078,mai@mail.com,"(CORBERA DE LLOBREGAT,BARCELONA,ES)"
49895133Z,NISAR,AHMED RAJA,606280948,mail@mail.com,"(SANT JOAN DESPI,BARCELONA,ES)"
41093191B,JUAN,AIXALA BRUNA,664573553,mail@mail.com,"(VALLIRANA,BARCELONA,ES)"
25443506D,MERCEDES,ALBAREDA NAGUILA,696113300,mail@mail.com,"(BARCELONA,BARCELONA,ES)"
46224778E,ANTONIO,ALMIRALL LLOPART,609476634,mail@mail.com,"(SANT JOAN DESPI,BARCELONA,ES)"
52363749V,ANGELES,ALONSO-MISOL GERLACHE,610438379,mail@mail.com,"(BARCELONA,BARCELONA,ES)"
37794545W,SOLEDAD,AMEZCUA VILLA,655857934,mail@mail.com,"(PALLEJA,BARCELONA,ES)"
46562593J,CARLES ANDRES,ANDRES OLLE,610758714,mail@mail.com,"(BARCELONA,BARCELONA,ES)"

Ejecutando

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DROP TYPE direccion CASCADE;
CREATE TYPE direccion AS (
  ciudad varchar(50),
  prov varchar(50),
  pais char(2)
);
DROP TABLE personas;
CREATE TABLE personas(
  id SERIAL,
  dni VARCHAR(12),
  nombres VARCHAR(50),
  apellidos VARCHAR(50),
  telefono VARCHAR(12),
  mail varchar(150),
  dir direccion
);
 
COPY personas(dni, nombres, apellidos, telefono, mail, dir) FROM '/home/datos/personas.csv' DELIMITER ',' CSV;

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar