C语言问题3-利用C语言读取CSV文件内的数据

本文介绍如何使用C语言读取CSV文件,通过定义结构体存储不同类型的数据,并提供了一个示例程序,展示了如何逐行读取文件内容,解析并存储到结构体数组中,适用于基础数据处理需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、问题描述

现有一个CSV文件,里边的数据需要进行自动化处理,如何利用C语言读取CSV文件内的数据。

2、解决方案

CSV文件中数据类型有多种,一般来说,每一列的数据类型相同,可以用结构体来将一行的数据存储。中间涉及到读取CSV数据,数据提取存放入结构体变量等关键步骤。

3、程序示例

/**************************************************************************/
//程序名:1Read_example.c
//程序作用:可以完整读取CSV的整个文件,并将这些数据放入结构体dataArr[]中
//程序使用:运行后,输入同目录下的文件名,可将csv中的数据读取到结构体
//作者:罗特布克;创建时间:2023.10.20
//备注:
/**************************************************************************/
/*包含的头文件*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>   //使用abs(对整数取绝对值)、fabs(对浮点型或小数取绝对值)
#include <stdbool.h> //布尔型数据需要

/*对数据量的宏定义*/
#define MAX_LINE_LENGTH 100   //设定每行最大的字符数,后边出现的MAX_LINE_LENGTH就使用1000来代替
#define MAX_LINE_NUMBER 40   //设定最大的行数,可按照实际的需求更改。
typedef struct csvdata1  //定义一个结构体来存放CSV的数据,定义表格中的数据可以用结构体来构造。这里也可以把结构体名data1省略(匿名结构体)。
{                     //匿名结构体: 这种定义方式只能定义一次,不能重新再去定义别的变量.
    int num;           //编号
    char name[50];    // 姓名
    float grade1;     // 科目1成绩
    float grade2;      // 科目3成绩
    float grade3;     // 科目3成绩
    float aver;      // 科目平均成绩
} Data;  //定义一个结构体变量Data
Data dataArr[MAX_LINE_NUMBER]; // 定义结构体数组dataArr[],这里省略了struct。
char line[MAX_LINE_LENGTH];    //定义字符串line,每行最大MAX_LINE_LENGTH个字符长度,字符串line中就包含一行的所有信息。
int dataIndex = 0;             //行数记录
/*主函数读取CSV数据*/
void main() 
{
    FILE *fp;
    char filename[40];           //文件名字(字符串)长度,一个字母占1个长度,最后加“\0”一个长度。
    SetConsoleOutputCP(65001);   //调用该API函数,设置控制台程序输出的代码页编码为utf-8格式。没有这个中文会成乱码。
    printf(" 输入文件名(需要带后缀.csv): ");     
    gets(filename); 
    fp=fopen(filename,"r");   
   
    if (fp == NULL)             //如果打开文件错误
    {
        printf("文件打开失败,请确认:\n 1、文件名是否输入正确\n 2、文件是否在本程序文件夹下 \n");
        system("pause");   //暂停显示
    }
    
/*csv数据读取部分*/
    while (fgets(line, sizeof(line), fp))            //fgets函数的用法?
    {
        char *token = strtok(line, ",") ; 
        dataArr[dataIndex].num = atoi(token);           //获取逗号之前的数据
        token = strtok(NULL, ",");                  //接着调用strtok(NULL, ",")以获取下一个逗号之后的部分
        strcpy(dataArr[dataIndex].name, token);
        token = strtok(NULL, ",");   
        dataArr[dataIndex].grade1 = atof(token);     //atof函数将其转换为浮点数后赋值给dataArr[dataIndex].score
        token = strtok(NULL, ",");   
        dataArr[dataIndex].grade2 = atof(token);
        token = strtok(NULL, ",");   
        dataArr[dataIndex].grade3 = atof(token);
        dataIndex++;                            //记录数据量
    }
    fclose(fp);
  /*计算输出结果*/
    for (int i = 0; i < dataIndex; i++) 
    {
        dataArr[i].aver=(dataArr[i].grade1+dataArr[i].grade2+dataArr[i].grade3)/3; //计算平均值
        printf("number: %d, name: %s, grade1: %f, grade2: %f, grade3: %f, average: %f \n",
               dataArr[i].num, dataArr[i].name, dataArr[i].grade1, dataArr[i].grade2, dataArr[i].grade3, dataArr[i].aver);
     }
    system("pause"); //暂停显示输出结果
}

4、结果展示

读取的文件需要放在应用程序相同的文件夹下,命名如test.csv。WPS打开如下:

读取后显示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值