Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用c删除csv文件的特定列_C_Arrays_Csv_Struct - Fatal编程技术网

如何使用c删除csv文件的特定列

如何使用c删除csv文件的特定列,c,arrays,csv,struct,C,Arrays,Csv,Struct,这是我的csv文件,我想获取其名称以“A”开头的特定行,仅包含1、2和6列。例如,像bread、anname、Ot这样的列不应该出现在输出中。我已经附上了我需要的输入和输出。请帮忙 输入如下所示: Name,id,bread,anName,Ot,number A,1,animal,tiger,op,2.1vd M,2,animal,toper,ip,9.1vd A1,7,animal,dog,cp,Na11 A2,9,animal,mouse,ap,0 A23,9,animal,pouch,gp

这是我的csv文件,我想获取其名称以“A”开头的特定行,仅包含1、2和6列。例如,像bread、anname、Ot这样的列不应该出现在输出中。我已经附上了我需要的输入和输出。请帮忙

输入如下所示:

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

输出应为:

A,1,2.1vd
A1,7,Na11
A2,9,0
A23,9,Na11

代码

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

#define NUMLETTERS 5000

typedef struct {
    char Name[100];
    int id;
    char bread[200];
    char anName[200];
    char ot[200];
    char Number[200];

} record_t;

int main (int argc, char **argv) {

    record_t records[NUMLETTERS];
    char buf[6 * NUMLETTERS] = "";
    int count = 0, i;

    /* use filename provided as 1st argument (stdin by default) */
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
      fp = fopen("letters.csv", "r");

    if (!fp) {  /* validate file open for reading */
        perror ("file open failed");
        return 1;
    }

    while (fgets (buf, sizeof buf, fp)) {   /* read each line into buf */
        record_t tmp = { .Name = "" };    
        if (*buf != 'A')                    
            continue;
        if (sscanf (buf, " %99[^,],%d,%[^\n],%s,%s,%s",
                    tmp.Name, &tmp.id, tmp.bread, tmp.anName, tmp.Ot, tmp.Number) == 6)
            records[count++] = tmp;
        else
            fprintf (stderr, "%d A record - invalid format.\n", count + 1);
    }

    if (fp != stdin)   /* close file if not stdin */
        fclose (fp);

    for (i = 0; i < count; i++)
#ifdef WITHPIN
        printf ("%-8s %2d     %s,%s,%s,%s\n",
                records[i].Name, records[i].id, records[i].bread, records[i].anName, records[i].Ot, records[i].Number);
#else
        printf ("%-8s     %d,%s\n", records[i].Name, records[i].id, records[i].Number);
#endif
}

#包括
#包括
#定义NUMLETTERS 5000
类型定义结构{
字符名[100];
int-id;
炭面包[200];
查·安纳姆[200];
charot[200];
字符数[200];
}记录;
int main(int argc,字符**argv){
记录[数字];
char buf[6*NUMLETTERS]=“”;
int计数=0,i;
/*使用作为第一个参数提供的文件名(默认为stdin)*/
文件*fp=argc>1?fopen(argv[1],“r”):stdin;
fp=fopen(“letters.csv”、“r”);
如果(!fp){/*验证文件是否打开以进行读取*/
perror(“文件打开失败”);
返回1;
}
while(fgets(buf,sizeof buf,fp)){/*将每一行读入buf*/
记录\u t tmp={.Name=”“};
如果(*buf!=“A”)
继续;
如果(sscanf(buf),%99[^,],%d,%[^\n],%s,%s),
tmp.Name和tmp.id、tmp.bread、tmp.anName、tmp.Ot、tmp.Number)==6)
记录[计数++]=tmp;
其他的
fprintf(stderr,“%d A记录-格式无效。\n”,计数+1);
}
如果(fp!=stdin)/*如果不是stdin,则关闭文件*/
fclose(fp);
对于(i=0;i
快速浏览,您的代码看起来应该做您想要的事情-什么不起作用?我得到的输出是“1 a记录-无效格式”。在循环中,
%[^\n]
将匹配新行之前的所有内容(但不包括新行),这不是您想要的。您应该匹配到(但不包括)逗号。
sscanf(…,%99[^,],%d,%199[^,],%199[^,],%199[^,],%199[^,],%199s“,…)
您能告诉我在哪行出错吗