gpt4 book ai didi

c - 当表格损坏时用 C 读取 CSV

转载 作者:行者123 更新时间:2023-11-30 15:54:15 25 4
gpt4 key购买 nike

这是我读取 CSV 文件的 C 代码:

#include <stdio.h>
struct record
{long a,b,c; };

int main(void)
{
const char filename[] = "b.csv";
FILE *file = fopen(filename, "r");

if ( file != NULL )
{
char line [ 80 ];
struct record record [ 50 ];
size_t count, i = 0;

while ( i < sizeof record / sizeof *record )
{
if ( fgets(line, sizeof line, file) == NULL )
{
break;
}

if ( sscanf(line, "%ld,%ld,%ld", &record[i].a,&record[i].b,&record[i].c) == 3 )
{
++i;
}
}
fclose(file);

for ( count = i, i = 0; i < count; ++i )
{
printf("record[%lu]: a = %ld b = %ld c = %ld\n",
(long unsigned)i, record[i].a, record[i].b,record[i].c);
}
}
else
{
perror(filename);
}
return 0;
}

/* 文件.csv

301,36,15
302,88,75

// 我的输出

record[0]: a = 301 b = 36 c = 15
record[1]: a = 302 b = 88 c = 75

*/

上面的代码有两个问题..

第一期是:/* 文件.csv

 301,,15
302,88,
,,,34

输出应该是

record[0]: a = 301 b = 0 c = 15
record[1]: a = 302 b = 88 c = 0
record[2]: a = 0 b = 0 c = 34

第二个问题是它应该读取文件直到“eof”。这里我取50作为静态行号值。我应该做出哪些改变?

看到我已经这样更改了代码...

  const char* getfield(char* line, int num) {
const char* tok;
for (tok = strtok(line, ",");
tok && *tok;
tok = strtok(NULL, ",\n"))
{
if (!--num)
return tok;
}
return NULL;
}

int main()
{
FILE* stream = fopen("b.csv", "r");
char line[1024];
char *pstr;int num;
const char* value;

while (fgets(line, 1024, stream))
{
char* tmp = strdup(line);
//printf("Field 3 would be %s\n", getfield(tmp, 3));
value=getfield(tmp, 3);
num =strtol(value,&pstr,10);
printf("Field 3 would be %d\n", num);
// NOTE strtok clobbers tmp
free(tmp);
}
}

最佳答案

而不是

sscanf(line, "%ld,%ld,%ld", &record[i].a,&record[i].b,&record[i].c)

行,您可以使用 strtok_r() 函数 ( documentation ) 将行拆分为以逗号分隔的子字符串。然后,对每个子字符串执行 strtol() 调用 ( documentation ) 以获取其整数值,或者如果它是空字符串,则将相应的变量设置为 0

您可以使用检查空字符串

if (str[0] == 0) {
// empty
}

要读取到 EOF,只需检查 fgets() 返回 NULL 并检查 if (feof(file)) - 如果到达文件末尾,fgets() 设置 FILE * 流的 EOF 指示符,并返回 NULL .

关于c - 当表格损坏时用 C 读取 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13133612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com