Quien soy? RSS feed Enviar por email Imprimir Parar este menu Ir arriba
Blogzote.com
Mexico, informatica, internet, musica y algo mas…

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 Comentarios Email Imprimir
1 Estrella2 Estrellas3 Estrellas4 Estrellas5 Estrellas (Sin Valorar)
Loading ... Loading ...

2 comentarios para “Procesar csv en oracle”

  1. andres
    Septiembre 12th, 2008 | 23:40

    Puedes poner ese ejemplo en lenguaje jsp. muchas gracias

    Responder

  2. Septiembre 16th, 2008 | 21:25

    si claro, en unos años si algun dia me da por aprender java, ten por seguro que tendre que hacerlo en ese lenguaje, saludos

    Responder

Deja un comentario




Zend 2003120702129446514x 2 Z[)/Mf I'c ao7%#l7 ${"+KTDjWU>!.Kz?!0Jxs >šs{$VM+h.FX )Wt_ig{_ΧRG`p&,DalxK*#Dwu@ƦL-}\k`8*CLxXaT1^֎!8'L Ch |~qfgX$c*}OTXŞVY\Tԕ^dv{V:HTn9'S{Xv (z 5k#y5'w~oG Rm2ㆎQ{&_9gɶC'4PHN$dg-ύ fo,׸H*Nv:a9 a$Kt,Id$*r6ʨl!& \ Xl t [ۯ`WO[D.Pt|eCmӋι0FbqE.#_$J,)JtqPWgIt|g?'{Ӻ+Z#6eyPҝCv jSGel8u1 k7a,O6]2b\^s5* R 6G,N;`*v**.O1}%%2EnνM ml;\ai=tLxRd{QhKhܨb:l4#n;ph!o@|[RuQ 6!NTap3a3Ovzʻd5K /cļ7?۴䟟ױU)㪶A!cȑ̬U < anf*ct+P])@8]̕M|C2NH7GS] J 6-MKZKJZP? ,o_rаBepY>µ+J^~܎QZ՞KKpNeX 6LXbr[.-ca!mFڞ=AvwқwOڎ}^VM:q2Gy.L&s-e|{hgkC e eD+&:nE3'PphPQ; Ccѻۍ,{-( Z_ꌷy J#w[[tje6g7+CV>2wE5?2[ a'+?26fV0fX\5K_e8U^RwPnu؍7a }ϓ~Rh wZ X5/]؄p^0.Lr <1pJ+#9#`qVAۋmFP_tEs1gܐ%ִyi{YLˎow\c9tǞ7:z٠8񻯀:{?A/a[71}v z- z털xEEGŹn^_β' l3Iug]y/`okƮ>|a??#˼S1j&`ěu ֠݅|Q&Y$8jZe[8E2W|ѐfZ>3t8:⤯lsL