在C中读取多行csv文件

问题描述 投票:-1回答:3

我试图读取超过1行的csv文件,我已经成功读取1行csv文件,有人可以给我和示例读取多行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;
}
c csv
3个回答
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- "


0
投票

即使不考虑一行问题,您也错误地阅读了CSV。

CSV是一种格式,其中字段以逗号分隔(不是空格,就像您的代码所假设的那样),并且记录由换行符分隔;但它实际上要复杂得多:有逃生,你可以在一个数据中包含逗号和/或换行符。该格式在RFC 4180中正式记录。

但是你显然不应该重新发明轮子并编写自己的CSV解析代码。相反,使用一个公开可用的CSV解析器库,例如semitrivial's csv_parser或古老的libcsv


-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;
}

你想结束这样的事吗?

© www.soinside.com 2019 - 2024. All rights reserved.