c - 读取一个大的CSV文件并用C语言存储内容

标签 c arrays csv

我正在学习 C 编程,但被一段代码困住了。我想读取并存储大约 10000 行和 5 列的大型 CSV 文件,每列的名称为 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;

}

预先感谢您的帮助

最佳答案

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

您遇到的一些问题:

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

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

  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;
    
    
    
    }
    

关于c - 读取一个大的CSV文件并用C语言存储内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31118576/

相关文章:

c - 如何从 Mac 制作 Windows CLI

请求变量时的 C++ 调用函数

java - 在main方法处执行

java - 交换两个数组的值,创建另一个不重复的数组并从最高到最低排序

java - 在 Java 中将数据从 CSV 导入到 SQLite 表

c - Swift/C 互操作,Swift 中的结构数据更改未在 C 中更新

java - 给定数字 N,如何调用递归调用 N 次?

将 Lua 表转换为 C 数组?

excel - 为 Excel 生成 CSV 文件,如何在值内添加换行符

ios - CSV 解析 - Swift 4