基于C语言简易读取CSV文件

头文件

/*
 * Author : LHS
 *
 * Version: 1.00
 *
 * Date   : 2022-03-18
 *
 * Bref   : Read CSV files based on C language.
 *
 */

#ifndef __READ_CSV_FILE_H_
#define __READ_CSV_FILE_H_

#include <stdio.h>
#include <string.h>

#define MAX_LINE_SIZE 256   //fgets函数读取的最大字节数
#define CSV_SUCCESS  (0)
#define CSV_FAILED   (-1)

int openCsv(char* csvFilePath);  //打开csv文件
void closeCsv(void);             //关闭csv文件
int getTotalLineCount(void);     //计算csv文件中的总行数
int getTotalColCount(void);      //计算csv文件中的总列数(第一行为准)
int setRow(int row);             //设置光标指向第row行
char* getRow(int row);           //获取第row行的数据,并将指针指向下一行
char* getCurRow(void);           //获取当前行数据,并将指针指向下一行

#endif /* __READ_CSV_FILE_H_ */


源文件

/*
 * Author : LHS
 *
 * Version: 1.00
 *
 * Date   : 2022-03-18
 *
 * Bref   : Read CSV files based on C language.
 *
 */

#include "readCSVFile.h"
static FILE* fp=NULL;
static char s_stringBuf[MAX_LINE_SIZE];
static int s_total_row=0; //总行数,打开csv文件时更新
static int s_total_col=0; //总列数,打开csv文件时更新

//返回csv文件中的总行数
int getTotalRowCount(void)
{   
    return s_total_row;
}
//返回csv文件中的总列数(以第一行的列数为基准)
int getTotalColCount(void)
{   
    return s_total_col;
}
int openCsv(char* csvFilePath)
{
    char *ptr;

    //关闭上一个文件
    if(fp == NULL){
        closeCsv();
        fp = NULL;
    }

    //只读方式打开
    if( fopen_s( &fp, csvFilePath, "r" ) != 0 )
    {
        return CSV_FAILED;
    }

    s_total_row=0;
    s_total_col=0;

    //获取列,分隔符为","
    fseek(fp,0,SEEK_SET);
    if (fgets(s_stringBuf, MAX_LINE_SIZE, fp))
    {
        ptr=strtok(s_stringBuf,",");
        while(ptr!=NULL) {
            ptr = strtok(NULL,",");
            s_total_col++;
        }
    }
    
    //获取总行数,以换行符结束
    fseek(fp,0,SEEK_SET);
    while (fgets(s_stringBuf, MAX_LINE_SIZE, fp)){
        s_total_row++;
    }

    memset(s_stringBuf,0,sizeof(s_stringBuf));
    fseek(fp,0,SEEK_SET);
    return CSV_SUCCESS;
}
void closeCsv(void)
{
    if(fp != NULL){
        fclose(fp);
    }
}
//设置当前行文件指针
int setRow(int row)
{
    if(fp == NULL) return CSV_FAILED;
    char strLine[MAX_LINE_SIZE];
    fseek(fp,0,SEEK_SET);
    while(row--){
        if(fgets(strLine,MAX_LINE_SIZE,fp) == NULL) return CSV_FAILED;
    }
    return CSV_SUCCESS;
}
//获取指定行数据
char* getRow(int row)
{
    if(fp == NULL) return NULL;
    if(setRow(row) == CSV_SUCCESS){
        memset(s_stringBuf,0,sizeof(s_stringBuf));
        if(fgets(s_stringBuf,MAX_LINE_SIZE,fp) == NULL) return NULL;
    }
    return s_stringBuf;
}
//获取当前行数据,文件指针增加到下一行
char* getCurRow(void)
{
    if(fp == NULL) return NULL;
    if(fgets(s_stringBuf,MAX_LINE_SIZE,fp) == NULL)return NULL;
    return s_stringBuf;
}

colhdr.csv文件数据(可以自己随便写一个,逗号分隔)

Open,High,Low,Close,Volume,Adj Close
64.529999,64.800003,64.139999,64.620003,21705200,64.620003
64.419998,64.730003,64.190002,64.620003,20235200,64.620003
64.330002,64.389999,64.050003,64.360001,19259700,64.360001
64.610001,64.949997,64.449997,64.489998,19384900,64.489998
64.470001,64.690002,64.300003,64.620003,21234600,64.620003

例程

#include "ReadCsvFile.h"

int main(int argc, char const *argv[])
{
    if(openCsv("colhdr.csv") == CSV_SUCCESS){
        printf("open colhdr.csv successful!\n");
        printf("row:%d\n",getTotalRowCount());
        printf("col:%d\n",getTotalColCount());
        printf("%s",getRow(0));
        printf("%s",getRow(1));
        printf("%s",getRow(2));
        setRow(0);
        for(int i=0;i<getTotalRowCount();i++){
            printf("%s",getCurRow());
        }
    }
    return 0;
}

输出信息
在这里插入图片描述

### 回答1: C语言可以通过打开文件读取其内容的方式来读取CSV文件。首先,需要使用fopen函数打开CSV文件。此函数接受两个参数:第一个参数是CSV文件的路径,第二个参数是以什么方式打开文件(例如只读、写入等)。在打开文件后,可以使用fgets函数一行一行地读取CSV文件的内容。fgets函数需要传递三个参数:第一个参数是要读取文件的缓冲区,第二个参数是每次读取文件的最大长度,第三个参数是文件指针。在读取完一行之后,可以使用strtok函数将一行数据分解成多个不同的数据单元,以便进一步分析和处理。strtok函数需要传递两个参数:第一个参数是需要分解的字符串,第二个参数是分隔符(通常为逗号)。在使用完CSV文件之后,需要使用fclose函数关闭文件和释放内存。 ### 回答2: C语言可以通过一系列的标准库函数来实现读取CSV文件的操作。首先,需要使用文件操作相关的函数打开CSV文件,例如fopen()函数,我们可以用以下方式来打开一个名为“data.csv”的CSV文件: ```c FILE *fp; fp = fopen("data.csv", "r"); ``` 其中,第一个参数是CSV文件文件名,需要包含完整的文件路径,第二个参数为打开文件的模式,这里使用“r”表示只读模式。 接下来,需要逐行读取CSV文件中的数据以及其它信息,可以通过fgets()函数来逐行读取CSV文件中的数据,例如: ```c char line[1024]; while (fgets(line, 1024, fp)) { //处理CSV文件中的数据 } ``` 在每一行读取到的数据中,需要进行分离和解析,可以使用strtok()函数将每一行数据拆分成一个个值。例如,可以使用以下方式将一行数据按照逗号分隔开来: ```c char *token; token = strtok(line, ","); while (token != NULL) { //处理每一个数据 token = strtok(NULL, ","); } ``` 最后,需要在处理完CSV文件中的数据之后,使用fclose()函数关闭文件,释放相应的资源。例如: ```c fclose(fp); ``` 通过以上步骤,我们可以在C语言中实现对CSV文件读取和处理。不同的数据格式和数据内容的特点,需要结合具体的需求进行调整和优化。 ### 回答3: C语言可以通过使用标准库中的函数来读取CSV(逗号分隔值)文件,例如fopen()、fgets()和fclose(),以下是一个简单的例子: 首先,可以使用fopen()函数打开文件,并返回一个指向文件的指针: ``` FILE *fp; fp = fopen("data.csv", "r"); ``` 第一个参数是文件名,第二个参数是用于文件的模式(“r”表示读取模式)。 接下来,可以使用fgets()函数从文件中逐行读取数据: ``` char line[1024]; while (fgets(line, 1024, fp)) { // 处理行数据 } ``` 此代码将逐行读取CSV文件中的数据,并将其存储在一个名为line的字符数组中。fgets()函数的第一个参数是存储读取行的数组,第二个参数是数组的大小,第三个参数是文件指针。 最后,使用fclose()函数关闭文件: ``` fclose(fp); ``` 以上是读取CSV文件的基本过程。解析行数据并获取逗号分隔的值需要更多的代码,但利用标准库中的函数来读取数据是一个有效的起点。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值