RE: de CSV a tabla en BD

From: Lazaro Rubén García Martinez <lgarciam(at)vnz(dot)uci(dot)cu>
To: Marcos Alberto Flores Valda <marcos(dot)flores(at)ende(dot)bo>
Cc: "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: de CSV a tabla en BD
Date: 2011-10-13 15:26:32
Message-ID: 294D3D02D5E18D42827B2ECFEADEB6881E3A0A72E2@mx-interno.vnz.uci.cu
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

OK.

De: Marcos Alberto Flores Valda [mailto:marcos(dot)flores(at)ende(dot)bo]
Enviado el: jueves, 13 de octubre de 2011 11:25
Para: Lazaro Rubén García Martinez
CC: pgsql-es-ayuda(at)postgresql(dot)org
Asunto: Re: [pgsql-es-ayuda] de CSV a tabla en BD

Pues te comento que la función no podía incluir COPY, por diversas restricciones y limitaciones, por eso es que se vió como mejor opción hacerlo de esta forma.
________________________________
De: "Lazaro Rubén García Martinez" <lgarciam(at)vnz(dot)uci(dot)cu>
Para: "Marcos Alberto Flores Valda" <marcos(dot)flores(at)ende(dot)bo>, pgsql-es-ayuda(at)postgresql(dot)org
Enviados: Jueves, 13 de Octubre 2011 11:17:32
Asunto: RE: [pgsql-es-ayuda] de CSV a tabla en BD

Marcos, no viste el ejemplo que hace un tiempo te mandé, con el cual podías almacenar los datos del Excel en la tabla, sin tantas complicaciones??

Saludos.

De: pgsql-es-ayuda-owner(at)postgresql(dot)org [mailto:pgsql-es-ayuda-owner(at)postgresql(dot)org] En nombre de Marcos Alberto Flores Valda
Enviado el: jueves, 13 de octubre de 2011 11:12
Para: pgsql-es-ayuda(at)postgresql(dot)org
Asunto: [pgsql-es-ayuda] de CSV a tabla en BD

Sobre el caso de subir un archivo CSV a una tabla de la BD y para el cual pedí ayuda a la lista,
aca les indico como hice la función:

--f_excel (archivo bytea, tabla varchar)

DECLARE
cant_filas integer; --la cantidad de filas del Excel original
cant_cols integer; --la cantidad de columnas del Excel original
vector text[]; --contiene las filas del excel
registros text[]; --contiene una fila de excel separada por comas
i numeric;--indice del for para las filas
j numeric;--indice del for para las columnas
aux text;-- bytea sin codificacion

v_consulta varchar;--consulta insert

BEGIN

aux := (select decode(archivo::text,'base64')); --se obtiene el bytea y se quita la codificación

vector := string_to_array(aux,'\\015\\012'); --descomponer el bytea en un vector que contenga una fila del CSV cada uno
--\\015\\012 --> ENTER o salto de linea/retorno de carro en el bytea

select array_upper(vector,1) into cant_filas; --cantidad de registros del CSV
for i in 1..(cant_filas-1) loop

v_consulta := 'insert into '||tabla||' values ('; --inicio del insert

registros := string_to_array(vector[i],';'); --descomponer cada fila para obtener las columnas del CSV
select array_upper(registros,1) into cant_cols; --cantidad de columnas del CSV

for j in 1..(cant_cols-1) loop

registros[j] := (select replace(registros[j]::text,',','.')); --reemplazar las comas por puntos
v_consulta := v_consulta ||''''|| registros[j] || ''','; --continuar con la insercion hasta la columna N-1

end loop;

v_consulta := v_consulta ||''''|| registros[cant_cols] || ''');'; --insertar la ultima columna
execute v_consulta; --ejecutar el insert

end loop;

return;

END;

Antes de llamar a esta función creo una tabla temporal en la función principal con los campos que necesito, esta función se encarga de recibir el CSV lo decodifica, lo separa y lo va insertando en la tabla temporal, en la función principal recibo los datos de la función y trabajo con ellos posteriormente para insertarlos en la tabla destino como lo muestro en la siguiente parte de código:

v_consulta := 'creación de la tabla temporal ';
execute v_consulta;
v_resultado := (llamada a la función f_excel(CSV, tabla temporal));
v_consulta := 'selección de todos los registros de la tabla temporal';

FOR v_registros in EXECUTE(v_consulta) LOOP
.... (inserción de datos en la tabla destino)
end loop;

Se que encontrarán fallas en algunas partes y se puede optimizar el código de esta función por eso se las dejo para ver como podríamos mejorarla.

Saludos y gracias por los consejos.

--
[cid:image001(dot)gif(at)01CC8933(dot)075E74F0]

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alejandro Carrillo 2011-10-13 15:32:25 Re: urgente!!!
Previous Message Marcos Alberto Flores Valda 2011-10-13 15:24:55 Re: de CSV a tabla en BD