我正在尝试阅读超过1行的csv文件,我已经成功阅读1行csv文件,有人能给我和示例读取超过1行的csv文件吗? 这是输入样本:
Nama,Gaji,Zakat,Gaji Bersih
Ali,1234567,,
Sofyan,2345678,,
Kholimi,3456789,,
这里是我的1行csv阅读源代码:
#include <stdio.h>
#include <string.h>
int main(void)
{
char nama[100], gaji[100], zakat[100], bersih[100];
FILE* f = fopen("2.csv", "r");
fscanf(f, "%s %s %s %s", nama, gaji, zakat, bersih);
//delete comma
size_t len = strlen(gaji);
size_t len1 = strlen(nama);
size_t len2 = strlen(zakat);
gaji[len - 1] = '\0';
nama[len1 - 1] = '\0';
zakat[len2 - 1] = '\0';
//delete comma
printf("%s \t %s \t %s \t %s \n", nama, gaji, zakat, bersih);
fclose(f);
return 0;
}
答案 0 :(得分:2)
如果您想使用fscanf
读取多行,因为它们具有相同的含义
格式,我用fgets
阅读整行,并用sscanf
解析它
这种方式更容易处理格式错误:
int main(void)
{
char nama[100], gaji[100], zakat[100], bersih[100];
FILE* f = fopen("2.csv", "r");
if(f == NULL)
{
fprintf(stderr, "Cannot open file\n");
return 1;
}
char line[1024];
size_t lineno = 0;
while(fgets(line, sizeof line, stdin))
{
lineno++;
if(sscanf(line, "%99s,%99s,%99s,%99s", nama, gaji, zakat, bersih) != 4)
{
fprintf(stderr, "format error on line %zu\n", lineno);
continue;
}
printf("line %zu: name: %s, gaji: %s, zakat: %s, bersih: %s\n", lineno, nama, gaji, zakat, bersih);
}
fclose(f);
return 0;
}
您也可以使用strtok
来解析CSV的行,例如您
不知道有多少列或列有多个空格,
等:
int main(void)
{
FILE* f = fopen("2.csv", "r");
if(f == NULL)
{
fprintf(stderr, "Cannot open file\n");
return 1;
}
char line[1024];
size_t lineno = 0;
const char *delim = ",\n";
while(fgets(line, sizeof line, stdin))
{
lineno++;
char *token = strtok(line, delim);
if(token == NULL)
{
fprintf(stderr, "format error on line %zu\n", lineno);
continue;
}
printf("line %zu:");
do {
printf("-%s- ", token);
} while((token = strtok(NULL, delim)));
putchar('\n');
}
fclose(f);
return 0;
}
对于第"a,b,c,d,e"
行,它会打印"line 1: -a- -b- -c- -d- "
。
答案 1 :(得分:0)
即使不考虑一行问题,您也无法正确阅读CSV。
CSV是一种格式,其中字段以逗号分隔(不是空格,就像您的代码所假设的那样),并且记录由换行符分隔;但它实际上要复杂得多:有逃生,你可以在一个数据中包含逗号和/或换行符。格式正式记录在RFC 4180。
中但你显然不应该重新发明轮子并编写自己的CSV解析代码。相反,请使用其中一个公开的CSV解析器库,例如semitrivial's csv_parser或尊敬的libcsv。
答案 2 :(得分:-2)
#include <stdio.h>
#include <string.h>
int main(void)
{
char nama[100], gaji[100], zakat[100], bersih[100];
FILE* f = fopen("2.csv", "r");
while(fscanf(f, "%s %s %s %s", nama, gaji, zakat, bersih)!=EOF){
//delete comma
size_t len = strlen(gaji);
size_t len1 = strlen(nama);
size_t len2 = strlen(zakat);
gaji[len - 1] = '\0';
nama[len1 - 1] = '\0';
zakat[len2 - 1] = '\0';
//delete comma
printf("%s \t %s \t %s \t %s \n", nama, gaji, zakat, bersih);
}
fclose(f);
return 0;
}
你想结束这样的事吗?