aprendiendo ( Erlang ).

jueves, 1 de marzo de 2012

Ficheros II (CSV).

| 0 comentarios |

Hace poco tiempo me encontré con el problema de tener que manejar fichero de CSV muy, muy grandes con gran cantidad de datos. Lo que se quería era simple. Sólo necesitaba obtener un precio sumarle un tanto por ciento y añadirlo al final de la línea como otro campo cualquiera. La cosa es bien sencilla.

Para realizar este ejemplo me he creado un fichero CSV de ejemplo con el formato siguiente:

AAAAAAAAAAAA,BBBBBBBB,cccccccccc,dddddddddd,XXXXXX,XXXXXX,XXXXXX,XXXXXX,XXXXXX,Número

Para realizar este ejemplo vamos a tomar como entrada un fichero CSV con el formato anterior y vamos a generar otro con el formato siguiente:

AAAAAAAAAAAA,BBBBBBBB,cccccccccc,dddddddddd,XXXXXX,XXXXXX,XXXXXX,XXXXXX,XXXXXX,Número,Nuevo-Valor

Para empezar, he creado un módulo ficheroCSV con una función encargada de procesar el fichero de origen y escribir el resultado del proceso en fichero destino.

-module(ficheroCSV).
-compile(export_all).

procesar(Origen, Destino) ->
    case file:open(Origen, read) of
        {ok, Fd_origen} ->
            {ok, Fd_destino} = file:open(Destino, write),
            procesar_linea(Fd_origen, Fd_destino),
            file:close(Fd_origen),
            file:close(Fd_destino),
            {ok};
        {error, Motivo} ->
            {error, Motivo}
    end.

procesar_linea(Fd_origen, Fd_destino) ->
    case io:get_line(Fd_origen, '') of
        eof -> 
            io:format(" Done ~n");
        {error, Motivo} -> 
            {error,Motivo};
        Linea -> 
            Tokens = string:tokens(Linea, ",\n"),
            { Nuevo_valor, _ } = string:to_integer(lists:last(Tokens)),
            io:format(Fd_destino, "~s~n", [string:join(Tokens ++ [float_to_list(Nuevo_valor * 1.25)], ",")]),
            procesar_linea(Fd_origen, Fd_destino)
    end.

La función procesar/2 se encarga de abrir y cerrar los ficheros de origen y destino, y delega en la función procesar_linea/2 para el procesamiento línea a línea.

Para procesar una línea del fichero CSV tokenizamos la línea por comas, como es bien sabido, y añadimos el salto de línea para que no de problemas. Una vez procesada la línea escribimos el resultado en el fichero de destino. Este resultado no es más que realizar la operación contraria al string:tokens/2, que es string:join/2. Es decir, hemos decodificado el origen y hemos codificado el resultado.

En fin, facilísimo…

Publicar un comentario

0 comentarios:

 
Licencia Creative Commons
Aprendiendo Erlang por Verdi se encuentra bajo una Licencia Creative Commons Atribución-NoComercial-CompartirIgual 3.0 Unported.