如何解析csv文件中不同数量的数据?

时间:2013-12-06 11:24:32

标签: c

我正在处理将此文件作为students.csv文件提供给我们的作业:

Boyd,An,903-04-2620,53583,54678,59414 
Chen,Andrew,995-52-6987,57056,56361,60360,58819 
Delgado,Chetan,992-63-3996,57056,60359,58820 
Hong,Frederick,992-84-9667,61802,57058,60360,58841 
Lee,Daniel,995-59-4469,61750,60189,60360,58890 
Li,Garret,995-65-9809,60853,60295,60360,59363 
Mangan,Janet,995-59-4760,60855,61367,59383 
McCullough,Jason,995-83-8060,51909,61626,61637,60364 
Ng,Joey,995-46-4586,57056,61670,61674,60364 
Park,Komal,995-50-9519,61702,59420

正如您在此处所见,每行的数据是姓氏,名字,学生ID号,然后是与该标识相关的课程。我可以阅读其他所有内容,除非因为相关课程的数量可能会有所不同,最好是从0到5(作业有一个上限),我在如何识别和解析我的结构中的课程时遇到了麻烦。有人可以简单地建议一种方法来阅读它吗?

我正在使用以下代码阅读其余部分。我已经注释了一个部分,以填写阅读课程

ptr = strtok(temp, ",");
(*students)[*count_stud].last = (char*) malloc(strlen(ptr)*sizeof(char));
strcpy((*students)[*count_stud].last, ptr)
ptr = strtok(NULL, ",");
(*students)[*count_stud].first = (char*) malloc(strlen(ptr)*sizeof(char));
strcpy((*students)[*count_stud].first, ptr);
ptr = strtok(NULL, ",");
strcpy((*students)[*count_stud].ssid, ptr);
/*while(ptr = strtok(NULL, ","))
{
}*/ //end while crn strtok
(*count_stud)++;

这是我的结构,我已经找到了除crn [6]和count_classes之外的所有内容。

typedef struct
{
  char* first;
  char* last;
  char ssid[15];
  int crn[6];
  int count_classes;
}Student;

我已经按如下方式声明了结构,然后适当地使用了malloc(我不使用malloc作为crn)

Student *students=NULL;

1 个答案:

答案 0 :(得分:0)

是的,你使用strtok

走在正确的轨道上

通过检查返回值strtok,您可以确定字符串的可选部分,因为前三个字段是必需的,您可以这样做

Student* s = calloc( 1, sizeof(Student) ); // allocate new student
s->last = strdup( strtok(temp, ",") ); // allocate and copy
s->first = strdup( strtok(NULL, ",") ); 
strcpy( s->ssid, strtok(NULL, "," ) );

因为你说最多可以有五门课程,你需要说五个长期的东西来保存你的结构中的那些,但是如果你想要六个就可以。

您需要将字符串转换为整数

char* course = NULL;
while ((course = strtok(NULL,",")) != NULL && s->count_classes < 5)
{
  s->crn[s->count_classes++] = atoi( course );
}

上面的代码读取一个学生记录,我将留给你制作记录的数组(或链表)。提示:realloc()代替calloc(),但不要忘记初始化内容。