读取大型CSV文件并以C语言存储内容

时间:2015-06-29 14:40:30

标签: c arrays csv

我正在学习C编程并且遇到了一个代码。我想读取并存储一个大约10000行和5列的大型CSV文件,每个coloumn的名称为time,time_diff,SN,RS,Fr。

我为它编写了代码。因为我想读取不同的列,所以我使用strtok函数从一行读取并存储在不同的变量中。我可以在屏幕上阅读文件并打印其内容。但我没有得到如何将内容存储在数组中。

我尝试创建一个结构数组,然后将值存储在这些数组中,但不知怎的,它不起作用。我使用了int变量i的一些随机值,只是为了检查它是否有效。

有人可以解释如何将这些不同的变量存储在数组中以及如何回调它们。就像我想打印SN [1000],然后如何存储它。 以下是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_SIZE 1024*1024
struct Filedata {
    char *time;
    int time_diff;
    int SN;
    int RS;
    int Fr;
};


struct Filedata Data[10000];

int main ()
{
    //char buffer [BUFFER_SIZE];
    char *buffer;
    FILE *fp;
    char *token;
    int filesize;
    int i;

    if ((fp=fopen("testfile.csv", "r"))==NULL)
    {
        printf ("file cannot be opened");
    }


    buffer = (char*)malloc (BUFFER_SIZE);

    if (buffer == 0)
    {
    printf("Error: Out of Memory");
    return 1;
    }


    fgets(buffer, BUFFER_SIZE, fp);
    token = strtok(buffer, ";");


    while (token !=NULL)
    {
    printf (" \t%s", token);
    token = strtok (NULL, ";");
    }
    for (i=0; i<4;i++)
    {

        while ((fgets(buffer, filesize, fp)))

        {


            token = strtok(buffer, ";");
            Data[i].time = token;

            token = strtok(NULL, ";");
            Data[i].time_diff = token;

            token = strtok(NULL, "; ");
            Data[i].SN = atoi(token);


            token = strtok(NULL, "; ");
            Data[i].RS = atoi(token);


            token = strtok(NULL, "; ");
            Data[i].Fr = atoi(token);



            printf("\t%s\t%s\t%d\t%d\t%d\t\n", Data[i].time, Data[i].time_diff, Data[i].SN, Data[i]. RS, Data[i]. Fr);


        }
     }


    free (buffer);


return 0;

}

提前感谢您的帮助

2 个答案:

答案 0 :(得分:1)

您的代码有几个问题。请在下面找到更正后的版本。

您遇到的一些问题:

  1. 未在strtok中正确保存Filedata.time的结果。您需要复制字符串,而不是使用赋值。因此,您需要使用Filedata.timemalloc分配空间(不要忘记free您在此类情况下分配的每个Filedata.time)并复制strtok的结果{1}}那里;或者,如果您愿意,也可以使用固定长度的字符串。

  2. printf的上一个Data[i].time_diff中使用了错误的格式说明符。

  3. atoi未使用time_diff

  4. 使用未初始化的变量。您使用filesize变量而未初始化它。

    struct Filedata 
    {
        char *time; /*increase if you like or use dynamic memory*/
        int time_diff;
        int SN;
        int RS;
        int Fr;
    };
    struct Filedata Data[ARR_SIZE];
    
    int main(int argc, char *argv[])
    {
    
        char *buffer;
        FILE *fp;
        char *token;
        int filesize = 0;
        int i = 0, j=0;
    
        if ((fp=fopen("C:\\test.txt", "r"))==NULL)
        {
            printf ("file cannot be opened");
            return 1;
        }
    
    
        buffer = malloc (BUFFER_SIZE);
        if (buffer == NULL)
        {
            printf("Error: Out of Memory");
            return 1;
        }
    
    
        fgets(buffer, BUFFER_SIZE, fp);
        token = strtok(buffer, ";");
    
    
        while (token !=NULL)
        {
            printf (" \t%s", token);
            token = strtok (NULL, ";");
        }
    
        while ((fgets(buffer, BUFFER_SIZE, fp)))
        {
            if(i>=ARR_SIZE) break;
    
            Data[i].time=malloc(256); // Use constant(or define) which is more suitable for you
            token = strtok(buffer, ";");
            strcpy(Data[i].time,token);
    
            token = strtok(NULL, ";");
            Data[i].time_diff = atoi(token);
    
            token = strtok(NULL, "; ");
            Data[i].SN = atoi(token);
    
    
            token = strtok(NULL, "; ");
            Data[i].RS = atoi(token);
    
    
            token = strtok(NULL, "; ");
            Data[i].Fr = atoi(token);
    
    
            printf("\t%s\t%d\t%d\t%d\t%d\t \n", Data[i].time, Data[i].time_diff, Data[i].SN, Data[i].RS, Data[i].Fr);
            i++;
    
    
        }
    
        // Note: Also don't forget to free each  Data[i].time for
        // which you allocated space, e.g.
        for(j =0;j<i; j++) free(Data[j].time);
    
        free(buffer);
        return 0;
    
    
    
    }
    

答案 1 :(得分:0)

在你的代码中,你已经为时间声明了一个char指针,但你还没有为它分配任何内存。因此Data[i].time = token;实际上并没有存储任何内容。尝试在分配值之前动态分配内存,如下所示 Date[i].time=(char*)malloc(sizeof(char)*n); strcpy(Date[i].time,token); //replace n with the max length of the token string