From: | Marcos Alberto Flores Valda <marcos(dot)flores(at)ende(dot)bo> |
---|---|
To: | pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | de CSV a tabla en BD |
Date: | 2011-10-13 15:12:10 |
Message-ID: | f4191feb-5821-44a5-a905-716c3c2eed35@metro.ende.bo |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
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.
From | Date | Subject | |
---|---|---|---|
Next Message | Lazaro Rubén García Martinez | 2011-10-13 15:17:32 | RE: de CSV a tabla en BD |
Previous Message | Yessica Brinkmann | 2011-10-13 14:46:38 | Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Herramienta para generación automática de índices en Postgres |