簡體   English   中英

在 C 中讀取超過 1 行的 csv 文件

[英]Read more than 1 line csv file in C

我正在嘗試讀取 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;
}

如果你想用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- "

即使不考慮只有一行的問題,您也錯誤地讀取了 CSV。

CSV 是一種格式,其中字段用逗號分隔(不是空格,就像你的代碼假設的那樣),記錄用換行符分隔; 但實際上比這復雜得多:有轉義,並且您可以在單個數據中包含逗號和/或換行符。 該格式正式記錄在RFC 4180 中

但您顯然不必重新發明輪子並編寫自己的 CSV 解析代碼。 相反,使用公開可用的 CSV 解析器庫之一,例如semitrivial 的 csv_parser或古老的libcs​​v

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

你想以這樣的方式結束嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM