C语言读取CSV文件
2016-04-08 20:01
531 查看
最近做一个模块,需要通过C语言实现CSV文件的读取,自己这边参考晚上大神的文章,重新开发做了封装,也希望对大家有点帮助。
使用方法可以从下面的main函数看出来,首先用
运行结果如下:
(不需要关心数据这个只是个普通的测试文档,告诉大家这个方法是可行的)
封装文件如下:
ReadCsvFile.c:
//////////////////////////////////////////////////////////////////////////
// 源文件Read csv file data
//////////////////////////////////////////////////////////////////////////
ReadCsvFile.h:
//////////////////////////////////////////////////////////////////////////
// 头文件Read csv file data
//////////////////////////////////////////////////////////////////////////
附vs2010下编译的工程:ReadCSVFile
http://pan.baidu.com/s/1i4IcENF
附参考大神的博客文章,大家可以借鉴:
http://blog.sina.com.cn/s/blog_6163bdeb0100qr2r.html
ReadCSVFile.h是我自己定义实现csv文件读写的头文件,同样的,
ReadCSVFile.c是我自己定义实现csv文件读写的源文件。
使用方法可以从下面的main函数看出来,首先用
ReadCsvData()读取Csv文件到一个数组中,然后就可以使用
ShowCsvData()读取想要的某行的数据了,最后结束时要用
FreeCsvData()释放空间。
#include "ReadCSVFile.h" int main(void) { char *filename="Test.csv"; ReadCsvData(filename); //读取csv数据 ShowCsvData(); //通过控制台显示读取的csv数据 FreeCsvData(); //释放动态数组 return 1; }
运行结果如下:
(不需要关心数据这个只是个普通的测试文档,告诉大家这个方法是可行的)
封装文件如下:
int GetTotalLineCount(FILE* fp); //计算csv文件中的总行数 int GetTotalColCount(FILE * fp); //计算csv文件中的总列数(以第一行的列数为基准) int AssignSpaceForData(int inumdata); //通过指针*giCsvData给数据动态分配内存空间 void FreeCsvData(); //释放动态数据内存 int ReadCsvData(char* csvFilePath); //读取Csv中数据(本例默认数据类型为int) void ShowCsvData(); //通过控制台显示读取的csv数据
ReadCsvFile.c:
//////////////////////////////////////////////////////////////////////////
// 源文件Read csv file data
//////////////////////////////////////////////////////////////////////////
#include "readCSVFile.h" //计算csv文件中的总行数 int GetTotalLineCount(FILE * fp) { int i = 0; char strLine[MAX_LINE_SIZE]; fseek(fp,0,SEEK_SET); while (fgets(strLine, MAX_LINE_SIZE, fp)) i++; fseek(fp,0,SEEK_SET); return i; } //计算csv文件中的总列数(以第一行的列数为基准) int GetTotalColCount(FILE * fp) { int i = 0; char strLine[MAX_LINE_SIZE]; fseek(fp,0,SEEK_SET); if (fgets(strLine, MAX_LINE_SIZE, fp)) { i=strlen(strLine)/2; //因为csv文件以逗号','作为分隔符,所以此处除以2 } else { fseek(fp,0,SEEK_SET); return -1; } fseek(fp,0,SEEK_SET); return i; } // 通过指针*giCsvData给数据动态分配内存空间 int AssignSpaceForData(int inumdata){ giCsvData=NULL; giCsvData = (int*)malloc(sizeof(int)*inumdata); if (giCsvData == NULL) return 0; memset(giCsvData, 0, sizeof(int)*inumdata); return 1; } // 释放动态数据内存 void FreeCsvData(){ free(giCsvData); giCsvData = NULL; } // 从csv文件中读取数据 int ReadCsvData(char* csvFilePath) { FILE* fCsv; char *ptr; char strLine[MAX_LINE_SIZE]; int i; int j; // 已经有了数据,则先删除 if (giCsvData != NULL) FreeCsvData(); // 打开文件 if( fopen_s( &fCsv, csvFilePath, "r" ) != 0 ) { printf("open file %s failed",csvFilePath); return -1; } else { // 确定动态数组的大小,然后开辟空间 giNumRow = GetTotalLineCount(fCsv); giNumCol = GetTotalColCount(fCsv); giNumData = giNumRow*giNumCol; AssignSpaceForData(giNumData); // 读取数据 for (i = 0; i < giNumRow; i++) { j=0; if(fgets(strLine,MAX_LINE_SIZE,fCsv)) { ptr=strtok(strLine,","); //返回字符数组中字符‘,’之前的字符,剩下的保留到静态数组中(此方法vs认为不安全) //可以尝试使用strtok_s替换 while(ptr!=NULL) { giCsvData[i*giNumCol+j]=atoi(ptr); //将字符转换为int类型数据并保存到动态数组中 j++; 4000 ptr = strtok(NULL,","); //将从文件中读取的当前行剩余字符数组,读取字符‘,’前面的字节 } } } // 关闭文件 fclose(fCsv); } return 1; } //通过控制台显示读取的csv数据 void ShowCsvData() { int i; int j; for (i = 0; i < giNumRow; i++) { printf("Line %i :",i+1); //输出每行的行号 Line : for (j=0;j<giNumCol;j++) { printf("%i",giCsvData[i*giNumCol+j]); // 打印CSV数据 } printf("\n"); //输出换行 } }
ReadCsvFile.h:
//////////////////////////////////////////////////////////////////////////
// 头文件Read csv file data
//////////////////////////////////////////////////////////////////////////
#pragma once #include <stdio.h> #include <memory.h> // for memset #include <stdlib.h> // for malloc, free #include <string.h> // for strtok #define MAX_LINE_SIZE 256 //fgets函数读取的最大字节数 int* giCsvData ; //动态分配数据内存的指针 int giNumData ; //读取的数据字节数 int giNumRow ; //每行的字节数 int giNumCol ; // 每列的字节数 int GetTotalLineCount(FILE* fp); //计算csv文件中的总行数 int GetTotalColCount(FILE * fp); //计算csv文件中的总列数(以第一行的列数为基准) int AssignSpaceForData(int inumdata); //通过指针*giCsvData给数据动态分配内存空间 void FreeCsvData(); //释放动态数据内存 int ReadCsvData(char* csvFilePath); //读取Csv中数据(本例默认数据类型为int) void ShowCsvData(); //通过控制台显示读取的csv数据
附vs2010下编译的工程:ReadCSVFile
http://pan.baidu.com/s/1i4IcENF
附参考大神的博客文章,大家可以借鉴:
http://blog.sina.com.cn/s/blog_6163bdeb0100qr2r.html
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- mysql load data 导出、导入 csv
- 如何写好 C main 函数
- Lua和C语言的交互详解
- C#导出数据到CSV文件的通用类实例
- C#实现导入CSV文件到Excel工作簿的方法
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- 探讨C语言的那些小秘密之断言