我写了一个代码来读取一个csv文件在c.该文件包含游戏的数据,我应该读取它,并根据得分排序,并打印前10名评级游戏.代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define tablesize 18626
typedef struct
{
char title[200];
char platform[20];
char Score[20];
char release_year[20];
} dict;
void printValues(dict *values)
{
for (int i = 0; i < 100; i++)
{
printf("title->%s,platform->%s,Score->%s,release->%s\n", values[i].title, values[i].platform, values[i].Score, values[i].release_year);
}
}
void sort(dict *values)
{
for (int i = 0; i < tablesize; i++)
{
for (int j = i + 1; j < tablesize; j++)
{
int a = *values[i].Score - '0';
int b = *values[j].Score - '0';
// printf("%d %d\n",values[i].Score,values[j].Score);
if (a < b)
{
dict temp = values[i];
values[i] = values[j];
values[j] = temp;
}
}
}
}
int main()
{
FILE *fp = fopen("t4_ign.csv", "r");
if (!fp)
{
printf("Error");
return 0;
}
char buff[1024];
int row = 0, column = 0;
int count = 0;
dict *values = NULL;
int i = 0;
while (fgets(buff, 1024, fp))
{
column = 0;
row++;
count++;
values = realloc(values, sizeof(dict) * count);
if (NULL == values)
{
perror("realloc");
break;
}
if (row == 1)
{
continue;
}
char *field = strtok(buff, ",");
while (field)
{
if (column == 0)
{
strcpy(values[i].title, field);
}
if (column == 1)
{
strcpy(values[i].platform, field);
}
if (column == 2)
{
strcpy(values[i].Score, field);
}
if (column == 3)
{
strcpy(values[i].release_year, field);
}
field = strtok(NULL, ",");
column++;
}
i++;
}
fclose(fp);
printf("File loaded!\n", fp);
sort(values);
printValues(values);
free(values);
return 0;
}
我所面临的问题是CSV文件的标题字段中有逗号,因此它将逗号分隔的数据区分为不同的列,这在加载结构中的数据时会产生错误。
下面是输入文件的两个示例行。当标题包含逗号时使用引号。
"The Chronicles of Narnia: The Lion, The Witch and The Wardrobe",PlayStation 2,8,2005
The Chronicles of Narnia: Prince Caspian,Wireless,5,2008
有什么建议吗?先谢谢了。
2条答案
按热度按时间j2cgzkjk1#
由于title字段包含逗号时要使用引号,我建议您检查一下是否使用了
"
,如果是,请在第一项中使用该分隔符。第一个命令将逗号作为下一个字段的第一个字符,但下一个
strtok
将过滤掉它,因为它不允许“空”字段。o8x7eapl2#
函数
strtok
不适合您的需要,因为它将引号视为与其他字符一样的字符。因此,当strtok
看到逗号时,它不会关心逗号是否在引号内。此外,正如其他人在评论部分指出的,
strtok
的另一个问题是它跳过空字段。因此,我不建议使用
strtok
来完成您想要的任务。为了解决你的问题,我建议你自己写一个函数,它的功能和
strtok
和strsep
非常相似,但是如果第一个非whitespace字符是引号,它会把下一个引号当作分隔符,而不是下一个逗号。在下面的代码中,我把这个函数命名为my_strsep
。以下是一个示例:
此程序具有以下输出:
如您所见,函数
my_strsep
可以处理带引号和不带引号的字段。