| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
Genetizx
Registrado: 17 May 2014 Mensajes: 1
| Publicado: 25/05/2014 8:51 am | | | Título: Como puedo parsear datos? |
| Hola amigos, estoy trabajando con oun archivo .csv que contiene datos en éste orden
N1,N2,A1,A2;p1:p2:p3:p4:p5
esa es la estructura que existe lo que se me ocurrió hacer a mi fue lo siguiente:
| Código: | /*carga toda la información provista por el archivo filename donde n guardará la cantidad de docentes.*/ void cargar_datos(char *filename, Docente *d, int *n){ FILE *arch; arch = fopen(filename,"r"); char linea[256]; char *s=",";//Los nombres estan separados por coma char *f=";";//Entre los nombres y las notas hay un punto y coma que tambien debemos incluirlo char *g=":";//Las notas estan separadas por dos puntos. char *token;//n guardara cantidad de docentes int n=0; while(!feof(arch)){ fgets(linea,256,arch); token = strtok(linea,s); while( token != f){ token = strtok(linea,g); } while( token != NULL){ token = strtok(NULL,s); } }
fclose(arch); return 0;
}
|
|
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 7520 Ubicación: Mexico
| Publicado: 27/05/2014 5:43 am | | | Título: |
| Hola
Bienvenido a los foros. Por favor lee sus reglas.
----
Errores en esa función hay bastantes: * No verificas si la apertura del archivo fue exitosa. * Utilizas feof para controlar la lectura del bucle. * No utilizas los parámetros "d" y "n". * Por alguna razón comparas el valor de retorno de strtok con literales como "f" (no tiene sentido). * etc.
Para separar la linea utilizando strtok debes considerar en cada iteración cual de los separadores utilizar, esto lo puedes hacer fácilmente mediante arrays.
Un programa de ejemplo que muestra como procesar las lineas de tu ejemplo es:
| Código: | #include <stdio.h> #include <stdlib.h> #include <string.h>
#define NOM_ENTRADA "Entrada.txt" #define LONG_LINEA 1024
#define NUM_ELEM(a) (sizeof (a) / sizeof (a)[0])
int main(void) { FILE *in; char linea[LONG_LINEA]; char *sep[] = { ",", ",", ",", ";", ":", ":", ":", ":", "\n" }; size_t num_seps = NUM_ELEM(sep); size_t i; char *tok[NUM_ELEM(sep)]; char *p; if ((in = fopen(NOM_ENTRADA, "r")) == NULL){ perror(NOM_ENTRADA); return EXIT_FAILURE; } while (fgets(linea, LONG_LINEA, in) != NULL){ for ( i = 0, p = strtok(linea, sep[i]); i < num_seps && p != NULL; i++, p = strtok(NULL, sep[i]) ) tok[i] = p; if (i == num_seps){ for (i = 0; i < num_seps; i++) printf("tok[%lu] == \"%s\"\n", (unsigned long) i, tok[i]); putchar('\n'); }else puts("Error"); } fclose(in); return EXIT_SUCCESS; } |
Si el contenido del archivo "Entrada.txt" es:
| Código: | N1,N2,A1,A2;p1:p2:p3:p4:p5 N1,N2,A1,A2;p1:p2:p3:p4:p5 N1,N2,A1,A2;p1:p2:p3:p4:p5 |
La salida del programa es:
| Código: | tok[0] == "N1" tok[1] == "N2" tok[2] == "A1" tok[3] == "A2" tok[4] == "p1" tok[5] == "p2" tok[6] == "p3" tok[7] == "p4" tok[8] == "p5"
tok[0] == "N1" tok[1] == "N2" tok[2] == "A1" tok[3] == "A2" tok[4] == "p1" tok[5] == "p2" tok[6] == "p3" tok[7] == "p4" tok[8] == "p5"
tok[0] == "N1" tok[1] == "N2" tok[2] == "A1" tok[3] == "A2" tok[4] == "p1" tok[5] == "p2" tok[6] == "p3" tok[7] == "p4" tok[8] == "p5"
|
En base al ejemplo puedes realizar las adecuaciones a tu programa.
Un saludo _________________ C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language |
| | Volver arriba | |  | Gntzx
Registrado: 16 May 2012 Mensajes: 10
| Publicado: 30/05/2014 5:50 am | | | Título: |
| | Muchas gracias por la aclaración. |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |