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; |
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
Puedes poner ese ejemplo en lenguaje jsp. muchas gracias