繁体   English   中英

如何读取 .csv 文件并将其保存到二维数组中?

[英]How do I read a .csv file and save it into a 2d array?

我对 C 编程很陌生,我已经设置了读取包含 2d 整数数组的 .csv 文件的任务,然后我需要打印它以便它显示在终端中。 该数组是一个 4 行 x 2 列整数数组,但是当我使用此代码时,我会得到一个随机数字列表。 我附上了我使用的代码和 .csv 文件数组以及它应该是什么样子。

#include <stdlib.h>
#include <stdio.h>

int main()
{
    FILE *in_data = fopen("in.csv", "r");
    
    int i;
    int j;
    int trIn[4][2];
    if(in_data == NULL)
    {
        printf("error\n");
        return 1;
    }
    for(i = 0; i < 4; i++){
    for(j = 0; j < 2; j++){
        char junk;

        if (j != 0) fgetc(in_data);

        fscanf(in_data, "%c%d%c", &junk, &trIn[i][j], &junk);
        printf("%d ", trIn[i][j]);
    }
    fgetc(in_data);
    printf("\n");
    }
return 0;
}
    

.csv 文件数组:

0 0
0 1
1 0
1 1

.csv 文件(原始):

"0","0"
"0","1"
"1","0"
"1","1"

您可以创建一个丢弃不需要的字符的模式,如下所示:

现场演示

for (i = 0; i < 4; i++)
{
    for (j = 0; j < 2; j++)
    {
        //printf("%s", str); //print str to check if there are any weird chars
        fscanf(in_data, " \"%d\",", &trIn[i][j]);
        printf("%d ", trIn[i][j]);
    }
    printf("\n");
}

如果值后面的行中有空格,则可以检查fscanf 尽管在说明符之前有一个空格,就像在示例中一样,应该可以解决这个问题。

此外,您可以导出不带引号的.csv文件,如果这是您可以控制的。

您还可以使用fgetssscanf的组合来尝试更强大的方法:

现场演示

char str[20];
int i = 0;
int j = 0;

//...

while (i < 4 && fgets(str, sizeof str, in_data))
{
    //printf("%s", str); //print str to check if there are any weird chars
    if(sscanf(str, "\"%d\",\"%d\"", &trIn[i][j], &trIn[i][j+1]) == 2)
        printf("%d %d\n", trIn[i][j], trIn[i][j+1]);
    i++;
}

您可以用这个替换当前循环:

for(i = 0; i < 4; i++){
    for(j = 0; j < 2; j++){
        char junk;

        if (j != 0) fgetc(in_data);

        fscanf(in_data, "%c%d%c", &junk, &trIn[i][j], &junk);
        printf("%d ", trIn[i][j]);
    }
    fgetc(in_data);
    printf("\n");
}

这是有效的,因为fscanf(in_data, "%d", &trIn[i][j]) ) 从文件in_data读取一个 int ( %d ) 到trIn[i][j]的内存位置。 fgetc不起作用,因为它只读取一个字符,然后将其打印为整数。

编辑:现在,对于 .csv 文件中的每个值,您将"\\n字符读入垃圾变量。

逐行:

if (j != 0) fgetc(in_data); ,从 csv 文件读入垃圾变量(不是一行的第一个字符)。

fscanf(in_data, "%c%d%c", &junk, &trIn[i][j], &junk); 读到:

  • 第一:开头的"字符变成垃圾变量
  • 第二:进入trIn[i][j]内存位置的数字(int: %d )。
  • 第三个:结束"字符变成垃圾变量

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM