Oracle

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:

1
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:

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

Aquí les dejo la función:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
--
  -- 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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;

2 thoughts on “Procesar csv en oracle

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *