- Blogzote.com - https://www.blogzote.com -

Procesar csv en oracle

Esta está facilita, me tope con la necesitad de procesar un archivo csv (comma separated values o valores separados por coma) con utl_file no tuve mayor problema para leer el archivo, ¿pero la cadena (o registro) del archivo, como la leo? Fácil, cree una función a la que se le manda la cadena a procesar y la posición de la columna que deseas y te regresa su valor.

Si tienes por ejemplo la cadena:

11111,22222,33333,44444,55555

Necesitas sacar de esa cadena el 3 campo, o sea, el valor “33333″, solo generas la llamada a la función:

variable := get_string_value (3, ’11111,22222,33333,44444,55555’);

Aquí les dejo la función:

--
  -- GET_STRING_VALUE
  --
  -- return the string value for a string id "p_string_id"
  -- in a csv string "p_string"
  -- 
  function get_string_value (
     p_string_id            in      number,
     p_string               in      varchar2) 
     return varchar2 is
	 
     v_string_value varchar2(200);
  begin
  
    if (instr(p_string,',') > 0) and
       (p_string_id         > 0) then
       if p_string_id = 1 then
          v_string_value := substr(p_string, 0, instr(p_string,',',1,1)-1);
       else
         if (instr(p_string,',',1,p_string_id-1) > 0) and
            (instr(p_string,',',1,p_string_id)   > 0) then			
            v_string_value := substr(p_string, instr(p_string,',',1,p_string_id-1)+1, 
                                              (instr(p_string,',',1,p_string_id)-1 - 
                                               instr(p_string,',',1,p_string_id-1)));
         elsif
            (instr(p_string,',',1,p_string_id-1) > 0) and
            (instr(p_string,',',1,p_string_id)   = 0) then			
            v_string_value := substr(p_string, instr(p_string,',',1,p_string_id-1)+1, 
                                             (length(p_string) - 
                                               instr(p_string,',',1,p_string_id-1)));
         end if;
       end if; 
    end if;
  
    return v_string_value;
	
  end get_string_value;

Por supuesto no es la única forma de procesar una cadena con valores separados por coma, acá tengo otra forma mediante un loop:

declare
  v_line      varchar2(1000);
  v_value     varchar2(100);  
  v_index     number;
begin
  v_line  := '11111,22222,33333,44444,55555';
  v_index := 0;
  for i in 1.. length(v_line) loop
      if (substr(v_line, i, 1) = ',') or
         (length(v_line)       = i  ) then
         --aqui lo que deseas hacer para cada valor 
         --v_value tendra el valor del campo 
         v_value := replace(substr(v_line, v_index+1, (i-v_index)), ',','');
         v_index := i;
      end if;
  end loop;
end;