c - 如何使用c从csv文件中获取具有精确数据的特定行?

标签 c csv struct

这是我的 csv 文件,我只想获取以字符“A”开头的行,因此我得到了输出,但有一些附加列为“0”,请帮助我找出我是否出错了?

还有一件事我想删除特定的列,例如 bread,anName,ot

Name,id,bread,anName,Ot,number
A,1,animal,tiger,op,8.1
M,2,animal,toper,ip,9.1
A1,7,animal,dog,cp,Na11
A2,9,animal,mouse,ap,0
A23,9,animal,pouch,gp,Na11


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

#define NUMLETTERS 100

typedef struct {
    char Name[100];
    int id;
    char number[100];
} record_t;

int main(void) {
    FILE *fp;
    record_t records[NUMLETTERS];
    int count = 0, i;

    fp = fopen("letter.csv", "r");
    if (fp == NULL) {
        fprintf(stderr, "Error reading file\n");
        return 1;
    }

    while (fscanf(fp, "%s,%d,%s", records[count].name, &records[count].id, records[count].number) == 1) 
        count++;

    for (i = 0; i < count; i++) {
        if(records[i].Name[0] == 'A'){
            printf("%s,%d,%s\n", records[i].Name, records[i].id, records[i].number);
        }
    }

    fclose(fp);

    return 0;
}

我想要输出为:

A,1,8.1
A1,7,Na11
A2,9,0
A23,9,Na11

最佳答案

您有两个问题:

  1. %s 格式说明符告诉 fscanf读取空格分隔字符串。由于记录不是以空格分隔的,因此第一个 %s 将读取整行。

  2. fscanf 函数 returns它处理的成功解析元素的数量。由于您尝试读取三个值,因此应该与 3 而不是 1 进行比较。

<小时/>

现在有一种方法可以解决第一个问题:使用 %[ 格式说明符。它可以处理简单的模式,最重要的是,模式(在输入不匹配时读取)。

因此,您可以使用 %[^,] 告诉 fscanf 读取字符串,直到找到逗号:

fscanf(fp, " %[^,],%d,%s", records[count].Refdes, &records[count].pin, records[count].NetName)

仅第一个字符串需要使用 %[ 说明符,因为第二个字符串将以空格分隔(换行符)。

另请注意,%[ 格式之前有一个空格,用于读取和忽略前导空格,例如上一行的换行符。

关于c - 如何使用c从csv文件中获取具有精确数据的特定行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60034462/

相关文章:

c - GLFW 鼠标事件延迟与窗口拖动

python - 如果 csv 存储为变量,如何使用 pandas read_csv() 方法?

php - LOAD DATA LOCAL INFILE 只进入5行

if-statement - Golang 模板变量 isset

c - 我们如何将指向数组的结构指针重新加载回 uint8_t 数组?

C、将数组写入空白处

c - 如何用c语言编写替换函数

c - 防止对文件系统或分区的一部分进行未经授权的写访问

sql - 将 sql 结果导出到 CSV 时如何在单个单元格中使用逗号分隔值

c - enum DescriptorType DescriptorType :8; mean in C code? 是什么意思