De CSV a int *

Esta es nuestra solución para leer datos del tipo entero de un archivo CSV:

Nuestra fución devuelve un apuntador y recibe una cadena; primero definimos y asignamos valores a las variables que ocuparemos.

int * leerDatos(char * arc){
    int * resultado = NULL;//Aquí guardaremos el resultado
    int numelem = 0;//El número de elementos en el archivo, necesario para reservar memoria dinámicamente
    int n=1;
    FILE * fp = fopen(arc, "r");//Arbimos el archivo 'arc' solo para lectura.
    char * linealeida = (char *)calloc(tamano,sizeof(char));
    char * auxlinea = (char *)calloc(tamano,sizeof(char));
    /* 'tamano' es el numero aproximado de caracteres en nuestro archivo recomendamos, definirlo previamente */
    char * tokens;
También, es recomendable tomar alguna acción si nuestro archivo no pudo ser abierto correctamente.

Leemos la línea, y la copiamos a un auxiliar dado que la función que usaremos para separar los valores de las comas destruye la cadena y la necesitaremos dos veces. La función más importante es strtok(), de la cual, en el vínculo encontrarás más información.

// :)
    fgets(linealeida, tamano, fp);
    strcpy(auxlinea,linealeida);
    tokens = strtok(linealeida, "," );//Comenzamos a separar los valores entre las comas.
    while((tokens = strtok( NULL, "," )) != NULL )//Continuamos hasta que no haya más que separar.
        numelem++;//Aumentamos la cantidad de elementos que hay.

Reservamos memoria para guardar todos los elementos, más uno, dado que dentro del arreglo también guardaremos la cantidad de dígitos que leímos del archivo. En otras palabras dentro del arreglo guardaremos el tamaño del arreglo menos uno.

En este bloque de código, también usamos el auxiliar de cadena ya que en el bloque anterior la cadena inicial linealeida quedó vacía gracias a la función strtok(). Información acerca de atoi()

resultado=(int *)malloc(sizeof(int)*(numelem+1));
    resultado[0] = numelem;//La entrada 0 de nuestro arreglo, guardará la longitud del mismo menos 1
    tokens = strtok(auxlinea, "," );//Comenzamos a separar los valores de nuevo
    do{//Con atoi() convertiremos de char * a int.
      resultado[n++]=atoi(tokens);
    }while((tokens = strtok( NULL, "," )) != NULL );
    fclose(fp);//Cerramos nuestro archivo para evitar problemas posteriores
    return resultado;//Por último, regresamos el arreglo con los datos
}

Si, parte de nuestro proyecto de Estructura de datos. (descarga el código completo)


Agradecimientos a mi querida compañera de equipo Iraís con quien hacer tarea hasta da gusto :)

¡Saludos! @fferegrino :)

No comments:

Post a Comment

¡Hey, gracias por tu comentario! No seas anónimo, inicia sesión para que te responda más fácilmente.