一、问题描述
NAME;CLASE;GRADE
小惠 ;04;91
小明 ;01;55
科科 ;03;86
老罗 ;01;77
老大哥 ;01;96
老郭 ;07;86
娇娇 ;01;75
振宇 ;05;79
阿来 ;04;88
CICI ;03;99
假设有这么一个.csv文件,有三个字段(NAME,CLASE,GRADE),且数据间通过分号“;”分隔。现在要取用其中的数据,用C语言,在Linux下。
二、分析下
首先,这个.csv文件中有中文,可能涉及到编码转换的问题,可以使用notepad++查看一下格式,或者在Linux下执行file -i查看。由于Linux下一般是以UTF-8为默认编码的,所以如果文件是iso-8859-1(ANSI),在Linux中处理时就要考虑转码。
其次,用什么结构存储这个数据,一般最可能想到的是二维数组,但是这里有字符串(NAME、CLASE)数据,所以除非把GRADE也转变为字符串数据,才能定义一个存储字符串的二维数组,二维数组还要存储字符串,那不就是需要使用三维指针进行操作了么?不是不行,但是有点麻烦。所以,考虑结构体是比较好的选择。用结构体指针,指向一个结构体数组,结构体数组中,每一个结构体存储一个记录(一行)。
typedef struct list_log
{
char NAME[15]; /*实际测试数据,得到40个左右字节(含有无效空格,为节省内存,不存储)*/
char CLASE[3]; /*实际测试数据,得到2字节*/
char GRADE[3]; /*实际测试数据,得到2字节*/
} stru_list_record;
然后,考虑.csv文件的字段标题(NAME;CLASE;GRADE)没有什么用,为了处理方便,可以直接除去。
最后,考虑下基本的功能函数应该主要包括:获取.csv数据的行数、列数,解析数据,打印数据。当然,严谨一点,在一开始可以增加一个.csv文件的正确性检查、字符编码转换、备份文件等预备工作的检查函数。
三、代码
代码如下:
/*************************************************************************
> File Name: csv_prase_V1.0.c
> Author: hank
> Mail: 34392195@qq.com
> 使用:
> 可执行文件 csv文件
> eg:./main textfile.csv
>