这是我的 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
最佳答案
您有两个问题:
%s
格式说明符告诉fscanf
读取空格分隔字符串。由于记录不是以空格分隔的,因此第一个%s
将读取整行。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/