zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    python 数据结构与算法之排序(冒泡,选择,插入)
    python 面向对象基础和高级复习
    python numpy模块
    高精度算法
    数论
    位运算和时间复杂度的分析
    C++ OI图论 学习笔记(初步完结)
    C++语言入门知识点(详细版)【持续更新每周三更】,小舒舒戳这里!!!
    C++基础语言知识大汇总(不断更新!!!)
    二分
  • 原文地址:https://www.cnblogs.com/AlienfronNova/p/14669287.html
Copyright © 2011-2022 走看看