/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Como puedo parsear datos?

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
Genetizx



Registrado: 17 May 2014
Mensajes: 1

MensajePublicado: 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: 7516
Ubicación: Mexico

MensajePublicado: 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

MensajePublicado: 30/05/2014 5:50 am
Título:

Muchas gracias por la aclaración.
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com