【问题标题】:How do I read a .csv file and save it into a 2d array?如何读取 .csv 文件并将其保存到二维数组中?
【发布时间】:2020-10-29 22:30:13
【问题描述】:

我是 C 编程的新手,我已经设置了读取包含 2d 整数数组的 .csv 文件的任务,然后我需要打印它以便它显示在终端中。该数组是一个 4 行乘 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"

【问题讨论】:

  • 你能提供原始的.csv文件数据吗?
  • 注意fgetc 一次解析一个字符,包括空格和换行符。
  • 谢谢,最后一个问题:这些数字总是一个字符吗?

标签: c file-io


【解决方案1】:

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

Live demo

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 的组合的更强大的方法:

Live demo

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

【讨论】:

  • @xmxn 我添加了另一种方法,如果 ithis 不起作用,则说明您的文件存在严重问题。也许也不能解析可打印的字符。
  • fgets() 后跟sscanf()(或使用一对指针和strtol())始终是要走的路。
  • @DavidC.Rankin,当然。
【解决方案2】:

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

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", &amp;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", &amp;junk, &amp;trIn[i][j], &amp;junk); 读取:

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

【讨论】:

猜你喜欢
  • 2016-10-21
  • 1970-01-01
  • 1970-01-01
  • 2013-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 2012-11-06
相关资源
最近更新 更多