C语言读取CSV文件任意一行并拆分该行获取数据

版权声明:本文为博主原创文章,如有需要,请注明转载地址:http://blog.csdn.net/morixinguan。若是侵权用于商业用途,请联系博主,否则将追究责任 https://blog.csdn.net/morixinguan/article/details/84783834

前面学习过如何操作CSV文件也写了相应的博客:

https://blog.csdn.net/morixinguan/article/details/83344951

并且也了解到如何拆分字符串:

https://blog.csdn.net/morixinguan/article/details/82967304

本节我们需要实现一个这样的函数,原型如下:

void Display_Record_Data(int line) 

当line等于0时,表示读取CSV文件的第0行数据,等于100时,表示读取CSV文件的第100行数据,依次类推。

以下是我们要获取的数据,数据格式为:序号,时间,阈值,气雾,灵敏度

我们要做的事情就是,当传入为1时,则获取为当前CSV文件的第一行数据,并拆分出来。

源码实现:

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

#define SERIAL_NUMBER 0
#define DATE_TIME 1
#define DETECT_VALUE 2
#define SENSOR_STATU 3
#define SENSIVITY_STATU 4

struct Record_Page_Data
{
	 int serial_number ; 			
	 char date_time[20]  ;		
	 int detect_result ;			
	 int sensor_status ;			
	 int sensivity_status ;		
	
	 int year ; 
	 int month ; 
	 int day ;
	 int hour ; 
	 int minute ;
	 char _year[10]   ;
	 char _month[10]  ;
	 char _day[10]    ;
	 char _hour[10]   ;
	 char _minute[10] ;
};
struct Record_Page_Data csv_file_record ;

//根据逗号拆分字符串 
static int splitStr(char *str,char separator, char strs[][40]) 
{
    int i = 0,j = 0,n = 0;
    for(i = 0; str[i]; ++i) {
        if(str[i] == separator) {
            strs[n++][j] = 0;
            j = 0;
        }
        else strs[n][j++] = str[i];
    }
    strs[n++][j] = 0;
    return n;
}

//显示记录数据 
void Display_Record_Data(int line) 
{ 
     FILE *fp; 
     int para = 0 ;
     int item = 0 ;					
     int which_line = line;             //指定要读取哪一行
     if(which_line == 0 || which_line < 0)
     	return ;
     if(which_line > 0)
     	which_line-= 1 ; 
     int current_index=0;               //当前读取的行
     char strs[5][40] = {0};
     char strLine[50];                  //每行最大读取的字符数,可根据实际情况扩大
     
     if((fp = fopen("file.csv","r")) == NULL) //判断文件是否存在及可读
     { 
         printf("error!"); 
         return ; 
     } 
     while (!feof(fp)) 
     { 
        if(current_index == which_line)
        {
        	fgets(strLine,50,fp);  //读取一行
            printf("CSV文件原始数据:%s", strLine); //输出
            item = splitStr(strLine,',',strs);
			for(para = 0 ; para < item ; para++)
			{
				switch(para)
				{
					case SERIAL_NUMBER:
					 csv_file_record.serial_number 	  = atoi(strs[para]);
						break ;
					case DATE_TIME :
						memcpy(csv_file_record.date_time,strs[para],strlen(strs[para]));
						memcpy(csv_file_record._year,csv_file_record.date_time,4);
						memcpy(csv_file_record._month,csv_file_record.date_time+5,2);
						memcpy(csv_file_record._day,csv_file_record.date_time+8,2);
						memcpy(csv_file_record._hour,csv_file_record.date_time+11,2);
						memcpy(csv_file_record._minute,csv_file_record.date_time+14,2);
						csv_file_record.year   = atoi(csv_file_record._year);
						csv_file_record.month  = atoi(csv_file_record._month);
						csv_file_record.day    = atoi(csv_file_record._day);
						csv_file_record.hour   = atoi(csv_file_record._hour);
						csv_file_record.minute = atoi(csv_file_record._minute);
						break ;
					case DETECT_VALUE :
						csv_file_record.detect_result    = atoi(strs[para]);
						break ;
					case SENSOR_STATU :
						csv_file_record.sensor_status    = atoi(strs[para]);
						break ;
					case SENSIVITY_STATU:
						csv_file_record.sensivity_status = atoi(strs[para]);	
						break ;
				}
			 }    
			  
         }
         fgets(strLine,50,fp);  //读取一行,并定位到下一行
         current_index++;
     } 
     printf("序号:%d  时间:%d年%d月%d日 %d时%d分   阈值显示:%d   气雾状态:%d%%   灵敏度状态:%d\n",csv_file_record.serial_number,csv_file_record.year,csv_file_record.month, \
			 csv_file_record.day,csv_file_record.hour,csv_file_record.minute,csv_file_record.detect_result,csv_file_record.sensor_status,csv_file_record.sensivity_status);       
     fclose(fp);                     //关闭文件
     return ; 
}



int main(void)
{
	int i ; 
	for(i = 1 ; i < 8 ; i++)
		Display_Record_Data(i);
	return 0 ;	
}

运行结果:

在单片机fatfs上,我们一样也可以实现这样的功能,根据不同的实现可以组合出多种多样的应用。

参考资料:

https://blog.csdn.net/moqj_123/article/details/45897877

猜你喜欢

转载自blog.csdn.net/morixinguan/article/details/84783834