OK.

De: Marcos Alberto Flores Valda [mailto:[email protected]]
Enviado el: jueves, 13 de octubre de 2011 11:25
Para: Lazaro Rubén García Martinez
CC: [email protected]
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" <[email protected]>
Para: "Marcos Alberto Flores Valda" <[email protected]>, 
[email protected]
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: [email protected] 
[mailto:[email protected]] En nombre de Marcos Alberto Flores 
Valda
Enviado el: jueves, 13 de octubre de 2011 11:12
Para: [email protected]
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:[email protected]]

<<inline: image001.gif>>

Responder a