首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言讀取 CSV 數據並統計各年份總和與最大值完整實現

     編輯:C 語言問答

需求分析

  • 輸入:CSV 文件,首行表頭,後續每行:年份 + 8 個國家數值。
  • 處理:跳過表頭,逐行讀取,計算每年總和,追蹤最大總和及對應年份。
  • 輸出:所有年份及總和列表,最後輸出最大年份與總和。

數據樣本 (data.csv)

Year,USA,Japan,UK,China,Germany,France,Singapore,Netherlands
1991,258,44,75,0,30,25,0,31
1992,206,74,73,0,28,25,0,24
...
2010,288,224,113,99,72,62,41,52

完整代碼實現

#include <stdio.h>
#include <stdlib.h>

#define COUNTRY_COUNT 8
#define MAX_LINE 256

int main() {
    FILE *fp = fopen("data.csv", "r");
    if (!fp) {
        perror("無法打開文件");
        return 1;
    }

    char line[MAX_LINE];
    // 1. 跳過表頭
    if (!fgets(line, sizeof(line), fp)) {
        fprintf(stderr, "文件為空\n");
        fclose(fp);
        return 1;
    }

    printf("Year Sum\n");

    int maxYear = 0;
    long maxSum = 0;
    int year, vals[COUNTRY_COUNT];

    // 2. 逐行解析
    while (fgets(line, sizeof(line), fp)) {
        // 解析:年份 + 8 個整數,逗號分隔
        int parsed = sscanf(line, "%d,%d,%d,%d,%d,%d,%d,%d,%d",
                            &year,
                            &vals[0], &vals[1], &vals[2], &vals[3],
                            &vals[4], &vals[5], &vals[6], &vals[7]);
        if (parsed != 9) {
            fprintf(stderr, "行格式錯誤: %s", line);
            continue;
        }

        // 3. 計算總和
        long sum = 0;
        for (int i = 0; i < COUNTRY_COUNT; i++) sum += vals[i];

        // 4. 輸出該年總和
        printf("%d %ld\n", year, sum);

        // 5. 更新最大值
        if (sum > maxSum) {
            maxSum = sum;
            maxYear = year;
        }
    }

    // 6. 輸出最大值信息
    if (maxSum > 0) {
        printf("\nYear of Maximum Regional Offices = %d\n", maxYear);
        printf("Number of Regional Offices = %ld\n", maxSum);
    }

    fclose(fp);
    return 0;
}

關鍵技術點解析

  1. fgets + sscanf 組合:比直接 fscanf 更健壯,能處理行尾換行、多餘空格、錯誤行跳過。
  2. 返回值檢查:sscanf 返回成功賦值的項數,必須等於 9 才視為有效行。
  3. 長整型累加:總和可能超過 int 範圍,用 long 或 long long。
  4. 資源釋放:fclose(fp) 確保文件句柄歸還。

運行輸出示例

Year Sum
1991 463
1992 430
1993 491
...
2008 995
2009 961
2010 951

Year of Maximum Regional Offices = 2008
Number of Regional Offices = 995

進階擴展建議

  • 動態列數:先解析表頭統計列數,再動態分配 vals 數組。
  • 錯誤恢復:記錄錯誤行號,報告後繼續處理後續行。
  • 大文件優化:使用 mmap 或分塊讀取,避免大行緩衝區溢出。
  • 輸出重定向:./program > report.txt 直接生成報告文件。

總結

通過 fgets 逐行讀取 + sscanf 格式化解析 + 即時累加統計,即可高效、健壯地完成 CSV 數據的讀取、求和與極值查找。代碼結構清晰,錯誤處理完善,易於擴展應對更複雜的數據分析任務。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved