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 |
Imprimir |

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