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

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

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打开如下:

读取后显示:

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了读取CSV文件中的数据,可以使用C语言中的文件操作函数和字符串处理函数。具体步骤如下: 1. 打开CSV文件,使用fopen()函数打开文件,并使用文件指针指向该文件。 2. 读取CSV文件中的每一行数据,使用fgets()函数逐行读取CSV文件中的数据,并将其存储在一个字符数组中。 3. 将每一行数据按照逗号分隔符进行分割,使用strtok()函数将每一行数据按照逗号分隔符进行分割,并将分割后的每个字段存储在一个字符数组中。 4. 将分割后的数据进行处理,使用atof()函数将字符数组中的字符串转换为浮点数,并将其存储在一个数组中。 5. 关闭CSV文件,使用fclose()函数关闭文件。 下面是一个示例代码,可以读取CSV文件中的数据并将其存储在一个二维数组中: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LINE_LENGTH 1024 #define MAX_FIELD_LENGTH 128 #define MAX_FIELDS 10 int main() { FILE *fp; char line[MAX_LINE_LENGTH]; char *field; char fields[MAX_FIELDS][MAX_FIELD_LENGTH]; double data[MAX_FIELDS][MAX_FIELDS]; int i, j, num_fields = 0; fp = fopen("data.csv", "r"); if (fp == NULL) { printf("Failed to open file\n"); return 1; } while (fgets(line, MAX_LINE_LENGTH, fp) != NULL) { num_fields = 0; field = strtok(line, ","); while (field != NULL && num_fields < MAX_FIELDS) { strcpy(fields[num_fields], field); num_fields++; field = strtok(NULL, ","); } for (i = 0; i < num_fields; i++) { data[i][j] = atof(fields[i]); } j++; } fclose(fp); // 打印读取数据 for (i = 0; i < num_fields; i++) { for (j = 0; j < num_fields; j++) { printf("%f ", data[i][j]); } printf("\n"); } return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值