清晰脏数据,主要用c语言做,想利用结构体,不知道如何实现。自己的结构体与文件联系有错误,求带带

小憨憨不敢啊 2019-08-12 05:45:40
任务:清洗数据
找出不合法的数据,将不合法数据保存到日志文件中,将所有合法数据重新保存。
输入:
athlete_events.csv noc_regions.csv
输出:
athlete_events_ret.csv ret.log

输入文件athlete_events.csv中存放的是原始的"120年的奥林匹克历史:运动员和成绩",共2711117条记录,每条记录15个字段。
字段:
ID - Unique number for each athlete 编号
Name - Athlete's name 姓名
Sex - M or F 性别*
Age - Integer 年龄@
Height - In centimeters 身高@
Weight - In kilograms 体重@
Team - Team name 所属国家或地区
NOC - National Olympic Committee 3-letter code 所属奥委会
Games - Year and season 奥运会类型#
Year - Integer 举办年份#
Season - Summer or Winter 举办季节*#
City - Host city 举办城市
Sport - Sport 大项
Event - Event 小项
Medal - Gold, Silver, Bronze, or NA 获奖情况*

输入文件noc_regions.csv中存放的是所有奥委会的缩写及全称,例如
CHN,China,
TPE,Taiwan,
KOR,South Korea,

输出文件athlete_events_ret.csv中存放清洗后的所有合法数据

输出文件ret.log中分类存放所有非法记录。
分类标准:
1. 数据缺失:某条记录不足15个字段。
例如下面一条记录就缺少性别字段。
"7583","Ralph Banthorpe",19,174,63,"Great Britain","GBR","1968 Summer",1968,"Summer","Mexico City","Athletics","Athletics Men's 4 x 100 metres Relay",NA
2. 数值不合法:记录中的某个字段取值不合法。
例如下面一条记录的性别不合法,因为性别只能取"M"或"F"
"29575","Daniel Vargas dos Santos","T",25,188,78,"Brazil","BRA","2004 Summer",2004,"Summer","Athina","Modern Pentathlon","Modern Pentathlon Men's Individual",NA
例如下面一条记录的身高不合法,因为人不可能长这么高(378cm),这种情况可以考虑取所有身高平均值,在平均值上下设置阈值的方法来清洗。
"96349","Tom Portyk","M",17,378,67,"Czech Republic","CZE","2014 Winter",2014,"Winter","Sochi","Nordic Combined","Nordic Combined Men's Team",NA
例如下面一条记录的相关性不合法,因为"奥运会类型"和"举办年份"及"举办季节"是相关数据。
"118071","Istvn Talabos","M",24,185,105,"Hungary","HUN","1980 Summer",1981,"Summer","Moskva","Shooting","Shooting Mixed Skeet",NA
3. 历史数据不全:由于历史原因,导致某些数据缺失,在原始记录中用NA标记。
例如下面一条记录就缺少身高、体重字段。
"47298","Herbert Heinrich","M",28,NA,NA,"Germany","GER","1928 Summer",1928,"Summer","Amsterdam","Swimming","Swimming Men's 100 metres Freestyle",NA






...全文
102 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ggtythtr 2020-10-19
  • 打赏
  • 举报
回复
请问最后解决了吗,我最近也遇到了类似的大作业,不知道该如何解决
小憨憨不敢啊 2019-08-13
  • 打赏
  • 举报
回复
谢谢,我研究研究
赵4老师 2019-08-13
  • 打赏
  • 举报
回复
仅供参考:
//NAME: essaie bla bla
//DIMENSION: 8
//DATA
//1  14  15
//2  11  10
//3  6   4
//4  7   13
//5  9   21
//6  19  3
//7  1   5
//8  8   8
//EOF
//
// 文本文件中可能还含有其他内容,但是需要用到的内容即以上

//比如data.txt:
//NAME: essaie bla bla
//其它内容
//DIMENSION: 8
//其它内容
//DATA
//其它内容
//1  14  15
//其它内容
//2  11  10
//其它内容
//3  6   4
//其它内容
//4  7   13
//其它内容
//5  9   21
//其它内容
//6  19  3
//其它内容
//7  1   5
//其它内容
//8  8   8
//其它内容
//EOF

// 目标是要获取NAME后字串,DIMENSION后数值,以及DATA以下的数值
// 其中NAME就是随便个字句,DIMENSION是城市数量,DATA以下是城市编号,X坐标,Y坐标
// 所有的这些将赋值给一个事先定义好的结构
#include <stdio.h>
#include <string.h>
#define MAXCPL   80   //每行最大字符数
#define MAXCITY  100  //每组数据中DATA最多项数,DIMENSION的最大值
#define MAXNAMEL 32   //NAME最大长度
struct S {
    char NAME[MAXNAMEL+1];
    int  DIMENSION;
    struct D {
        int NO;
        int X;
        int Y;
    } DATA[MAXCITY];
} s;
FILE *f;
int st,n,i;
char ln[MAXCPL];
int main() {
    f=fopen("data.txt","r");
    if (NULL==f) {
        printf("Can not open file data.txt!\n");
        return 1;
    }
    st=0;
    n=0;
    while (1) {
        if (NULL==fgets(ln,MAXCPL,f)) break;
        if (st==0) {
            if (1==sscanf(ln,"NAME: %31[^\n]",s.NAME)) st=1;
        } else if (st==1) {
            if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;
        } else if (st==2) {
            if (0==strcmp(ln,"DATA\n")) st=3;
        } else if (st==3) {
            if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {
                n++;
                if (n>=MAXCITY || n>=s.DIMENSION) break;
            }
        }
    }
    fclose(f);
    printf("s.NAME=[%s]\n",s.NAME);
    printf("s.DIMENSION=%d\n",s.DIMENSION);
    for (i=0;i<n;i++) {
        printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);
    }
    return 0;
}
//s.NAME=[essaie bla bla]
//s.DIMENSION=8
//s.DATA[0].NO,X,Y=1,14,15
//s.DATA[1].NO,X,Y=2,11,10
//s.DATA[2].NO,X,Y=3,6,4
//s.DATA[3].NO,X,Y=4,7,13
//s.DATA[4].NO,X,Y=5,9,21
//s.DATA[5].NO,X,Y=6,19,3
//s.DATA[6].NO,X,Y=7,1,5
//s.DATA[7].NO,X,Y=8,8,8

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧