Data Munging
Data Munging 意思是将杂乱无章的数据进行整理
1. 练习
这里有三个基于现实数据的练习,请依次完成:
- Part1 天气数据
下载weather.dat(美帝一城市的天气数据,第一列 day number,第二列 最高温度,第三列最低温度),然后编写程序,输出具有最小温差的day number。- Part2 足球赛事表
下载football.dat(英超联赛2001/2比赛结果)。其中“F”列和“A”列包含总进球数和被进球数。编写程序打印出进球数和失球数差最小的队名。- Part3 DRY 融合
Don’t repeat yourself,尽可能抽离出以上两个程序的共同代码。
2. Kata问题
- 当你在写原始代码时的有没有哪些设计决策,使你在抽离通用代码时更加容易或困难?
- 第二个问题的编码是否受第一个的影响?
- 是否抽离尽可能多的代码是更好的?代码可读性是否因此变差?可维护性怎么样?
3. Part1练习解答
使用Qt编写程序,读取数据,并打印到控制台如下图:
可以看到,第一列为日期号码,第一列为最高温度,第二列为最低温度。解题思路:读取每行数据,依次将每行数据解析,分别存入字符串列表。维护一个dayNumber数组(最小温差天可能不止一个)0和有一个minDifference变量。依次读取每个字符串列表,通过比较当天的温差与最小温差,确定是否更新dayNumber数组。
Qt 实现如下:
#include <QCoreApplication>
#include<QString>
#include <QFile>
#include <QDir>
#include <QTextStream>
#include <QDebug>
#include <iostream>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile file(QDir::home().absoluteFilePath("E:\\Qt Project\\weather.dat"));
if(!file.open((QIODevice::ReadOnly))){//打开文档
qWarning()<<"Open file failed";
return -1;
}
QTextStream stream(&file);
QString line;
QVector<QString> dayNumber;
int minDifference =100;
while (stream.readLineInto(&line)) {
QStringList list = line.split(' ', QString::SkipEmptyParts);
qDebug() << list<< endl;
if(list.count()>13)
{
bool ok1,ok2;
int maxT = ((QString)list.at(1)).toInt(&ok1, 10);
int minT = ((QString)list.at(2)).toInt(&ok2, 10);
qDebug() << maxT<<":"<<minT<< endl;
if(ok1&&ok2)
{
if((maxT-minT)<minDifference)
{
minDifference = maxT-minT;
dayNumber.clear();
dayNumber.append(list.at(0));
}else if((maxT-minT) == minDifference)
{
dayNumber.append(list.at(0));
}
}else
{
qWarning()<<"Day:"<<list.at(0)<<" data type converted failed!"<<endl;
}
}
}
for(int i =0;i<dayNumber.count();i++)
{
qDebug() << "Day:"+dayNumber.at(i)+" has min difference!"<< endl;
}
return a.exec();
}