• C语言处理csv文件


    镇楼图

    Pixiv:唄

    csv文件又叫做逗号分隔值文件。每一列用逗号,隔开,每一行用换行符\n隔开,这样的文件格式固定也容易处理,可以通过EXCEL获取。据我所知有很多游戏设计者会将构思的方案或者平衡好的数据放在excel里,然后需要程序员便对此进行处理来获取数据。

    注:本篇blog需要你会C语言风格的IO

    博主写的关于C语言IO的随笔

    点我

    ==================

    要处理的数据文件data.csv

    黑魔术师,2500,2100
    盖亚,2300,2100
    猛犸的墓地,1200,1000
    银牙狼,1200,800
    友谊天使,1200,800
    巴比伦,800,600
    

    一开始我尝试使用结构体,发现太复杂了,而且无法用一个变量索引到结构体的成员变量,不具有通用性还有bug

    于是我改成三维数组了(因为太菜只能一个个getc)

    #include<stdio.h> 
    #include<stdlib.h>
    #define f(n) (n)
    
    void csvdata(FILE*,int);
    
    int main(void){
    	FILE* fp;
    	char n; 
    	printf("请输入要截取的数据数:\n",&n);
    	scanf("%d",&n);
    	csvdata(fp,n);
    }
    
    void csvdata(FILE* fp,int n){
    	fp = fopen("data.csv","r");
    	char s[5][3][20];
    	for(int i = 0;i < 5;i++){
    		for(int j = 0;j < 3;j++){
    			int count = 0;
    			for(int k = 0;;k++){
    				s[i][j][k] = getc(fp);
    				int ch = s[i][j][k];
    				if(ch == '\n' || ch == ',')break;
    				count++;
    			}
    			
    			for(int k = 0;k <= count-1;k++){
    				printf("%c",s[i][j][k]);
    			}
    			printf("\n");
    		}
    	}
    	fclose(fp); 	
    }
    

    但在最后我学习到了一个很神奇的格式化

    能让我学会如何去处理各种格式固定的数据文件。

    #include<stdio.h>
    #define f(n) (n)
    
    void csvdata(FILE* , int);
    
    int main(void){
    	FILE*fp;
    	char n;
    	printf("请输入要截取的数据数:\n",&n);
    	scanf("%d",&n);
    	csvdata(fp,n);
    }
    
    void csvdata(FILE*fp , int n){
    	fp = fopen("data.csv","r");
    	char name[f(n)][20],atk[f(n)][20],def[f(n)][20];
    	for(int i = 0;i < n;i++){
    		fscanf(fp,"%[^,],%[^,],%[^\n]\n",name[i],atk[i],def[i]);
    		//正是这个[]不仅让截取字符串变得简单
                    //注:scanf(%s,%s,%s\n)有很诡异的效果
                    //有兴趣的可以试试
    	}
        for(int i = 0;i < n;i++){
            printf("%s,%s,%s\n",name[i],atk[i],def[i]);
        }
        //这里已经是处理数据部分了
        //你可以对数据做更多复杂的处理
        fclose(fp);
    }
    

    如果说输出中文出现了乱码

    那么最有可能的原因是编码问题,这里我是用Notepad++转换编码

    看右下角的编码是UTF-8,而我要做的是把UTF-8的编码改成GB2312

    你可以清楚地看到,输出的正是GB2312编码的数据,而你存入这个字符的时候却是用UTF-8的编码,那也难怪会出错了。
    这里只要在GB2312编码下输出中文即可

    修正后的结果

    注:我只能确保我这个平台输出中文是用GB2312编码,我无法确保其他平台是否使用这个编码,也有可能使用GB2312就会出现乱码。具体情况还得要看你所使用的平台

    但出现乱码问题的原因就是数据源的编码和输出所使用的编码不一致

    参考资料

    https://zh.cppreference.com/w/cpp/io/c/fscanf

  • 相关阅读:
    报告论文:数字图像噪音处理研究
    报告论文:汽车GPS调度系统车载终端设计技术方案
    疾病研究:我是一名34岁的进行性肌营养不良症患者
    08年最热门七大技术和最紧缺的IT人才
    C#序列化
    网络游戏的数据管理
    2008年3月Google占美国搜索请求量市场份额达67.3%
    C#反转字符串效率最高的方法
    何时应该使用极限编程
    几种字符串反转方法效率比较
  • 原文地址:https://www.cnblogs.com/AlienfronNova/p/14669287.html
Copyright © 2020-2023  润新知