多思路解决数据分析问题

昨天朋友找我,让我帮我给她处理几个数据,然后就给了我原始数据的excel表格:

部分原始数据截图

下边来解释下,表格中数据含义。第一列‘序号’,自动生成,不用管;

A列,B列,数据为后边的列名,比如第一行数据,A的值为1,这个‘1’就是后边的列名为‘1’的数据,就是9,B的值为4,这个4就是后边列名为‘4’的数值,就是9;

‘I’列,这里暂时没用到,先不用管了;

需求,除了‘编号’、‘A’、‘B’、‘I’列,以及 ‘A’、‘B’ 对应数值所占用的列以外,在剩余的列中(这里是25列),每次随机取两列,计算出所有组合,把组合的列名以及列对应的数据导出。


好了 需求定了,下一步就是漫长的解决方案之路:

第一次,EXCEL直接解决,

 我分析了表格的数据,如果用Excel的随机函数,太麻烦(好像也实现不了),每一行的组合是 25x24=600 个可能的组合;生成的时候还要考虑第一个 和第二个取到的是否一样,这不现实,果断放弃;

第二次,mysql数据库工具直接处理:

正好之前下载了数据库工具,Navicat ,直接把数据导入,

Excel数据导入数据库

我思考了一下,其实现在要做的就是 从27列中,依次取两列,保证这两列不相同,同时也不是A、B两列中的数据即可;所以现在要做的就是循环取数据,这里有个很巧的地方是 要用的列名正好是数字,试了一下,SELECT `13` FROM `3D-澳利华-地表`; 嗯,是没有问题的;


搜索一列试试

接下来就是写循环语句,上网查了一下 原来是一个 存储过程,先查一行试试

 drop procedure if exists pppppp; 

delimiter //                                 

create procedure pppppp()                 

begin

  declare num int DEFAULT 1;                                           

     WHILE num < 10 DO

   SELECT num FROM `3D-澳利华-地表` LIMIT 1;

    SET num = num + 1;

 END WHILE; 

 COMMIT;

 end //

 CALL  pppppp(); 


存储过程

很显然,查到的结果不对,我想要的是是第N 行数据,这里返回的直接是 N。怀疑是 num这个 没有加反引号导致,再试

drop procedure if exists pppppp; 

delimiter //                                 

create procedure pppppp()                 

begin

  declare num int DEFAULT 1;                                           

     WHILE num < 27 DO

   SELECT `num` FROM `3D-澳利华-地表` LIMIT 1;

    SET num = num + 1;

 END WHILE; 

 COMMIT;

 end //

 CALL  pppppp(); 


存储过程

很显然 还是不对,问了相关朋友,让我试试`@num`,@`num`,均以失败告终;这第一步都都不通,剩下的都不用说了,放弃;

第三次,PHP导入

数据已经导入本地数据库,正好机器上有 PhpStorm,写代码导入数据;

public function eat(){

    $this->load->database();

    $error =$this->db->error();

    $query =$this->db->query('SELECT * FROM `3D-澳利华-地表`');

    if(!$query){

        echo 'database connect failed';

    } else {

        echo  json_encode($query->result());

    }

}


PHP代码

 浏览器 先看一下效果,


浏览器效果图

 有数据,但是仔细看,不太对,只取到了前四列,也就是列名不是数字的列,列名为数字的列一个没有,问了一下别人,说可能列名为数字,取数据的时候 集合的下标也是数字,所以取不到,朋友建议我改为字母,比如每个前边加A,‘1’变为‘A1’。

改,同时我把表名也改了,改为英文字母的,


数据库改列名后

再重新搜索,

public function eat(){

    $this->load->database();

    $error =$this->db->error();

    $query =$this->db->query('SELECT * FROM DIAOHUA');

    if(!$query){

        echo 'database connect failed';

    } else {

        echo  json_encode($query->result());

    }

}


PHP代码修改后

结果

浏览器显示

这回就没有问题了,数据都有。

本来是打算用php直接实现来的,奈何初学,玩不转,还是用自己熟悉的Objective-c来实现吧

直接上代码吧,获取到数据后的 数据分析实现,还是先拿一条数据实验:

-(void)dealData{

    int count=1;

        NSDictionary * dic =[self.dataArray objectAtIndex:0];

        int keyCount=dic.allKeys.count;

        for(int i=0;i

            for(int j=0;j

                if(i!=j){

                    NSString * iKey =dic.allKeys[i];

                    NSString * jKey =dic.allKeys[j];

                    id a = dic[@"A"];

                    id b = dic[@"B"];

                    NSString * aValue =[NSString stringWithFormat:@"A%@",a];

                    NSString * bValue =[NSString stringWithFormat:@"A%@",b];


                    if([iKey isEqualToString:@"A"]||[iKey isEqualToString:@"B"]||[iKey isEqualToString:@"I"]||[iKey isEqualToString:@"序号"]||[iKey isEqualToString:aValue]||[iKey isEqualToString:bValue]||[jKey isEqualToString:@"A"]||[jKey isEqualToString:@"B"]||[jKey isEqualToString:@"I"]||[jKey isEqualToString:@"序号"]||[jKey isEqualToString:aValue]||[jKey isEqualToString:bValue]){


                    }

                    else{

                        id iValue = dic[iKey];

                        id jValue = dic[jKey];

                        NSLog(@"%i A:%@ B:%@ M:%@ N:%@ %@ %@ \n",count,a,b,[iKey stringByReplacingOccurrencesOfString:@"A" withString:@""],[jKey stringByReplacingOccurrencesOfString:@"A" withString:@""],iValue,jValue);

                        count = count+1;

                    }

                }

            }

        }

}


ios代码

控制台输出结果:


打印台结果

正好600条,应该是没有问题的。

下一步就是导出,上网查到最简单的就是 控制台输出为日志:

 NSString *homeDir = NSHomeDirectory();

    NSLog(@"%@",homeDir);


    NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);


    NSString *documentDirectory =[paths objectAtIndex:0];


    NSString *fileName =[NSString stringWithFormat:@"dr.log"];//注意不是NSData!


    NSString *logFilePath =[documentDirectory stringByAppendingPathComponent:fileName];


    //先删除已经存在的文件

    NSFileManager *defaultManager =[NSFileManager defaultManager];

    [defaultManager removeItemAtPath:logFilePath error:nil];


    //将log输入到文件

    freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+",stdout);

    freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr);


iOS代码

再运行:


控制台输出

输出也没有问题,问了一下,最后想要的还是excel表格数据,重新导出:

-(void)createXLSFile {

    //创建存放XLS文件数据的数组

    NSMutableArray  *xlsDataMuArr =[[NSMutableArray alloc]init];

    //第一行内容

    [xlsDataMuArr addObject:@"num"];

    [xlsDataMuArr addObject:@"A"];

    [xlsDataMuArr addObject:@"B"];

    [xlsDataMuArr addObject:@"M"];

    [xlsDataMuArr addObject:@"N"];

    [xlsDataMuArr addObject:@"MValue"];

    [xlsDataMuArr addObject:@"NValue"];

    int columnCount = xlsDataMuArr.count;

    //加入数据;

    int count=1;

    //        NSDictionary * dic =[self.dataArray objectAtIndex:0];

    for(NSDictionary * dic in self.dataArray){

        int keyCount=dic.allKeys.count;

        for(int i=0;i

            for(int j=0;j

                if(i!=j){

                    NSString * iKey =dic.allKeys[i];

                    NSString * jKey =dic.allKeys[j];

                    id a = dic[@"A"];

                    id b = dic[@"B"];

                    NSString * aValue =[NSString stringWithFormat:@"A%@",a];

                    NSString * bValue =[NSString stringWithFormat:@"A%@",b];


                    if([iKey isEqualToString:@"A"]||[iKey isEqualToString:@"B"]||[iKey isEqualToString:@"I"]||[iKey isEqualToString:@"序号"]||[iKey isEqualToString:aValue]||[iKey isEqualToString:bValue]||[jKey isEqualToString:@"A"]||[jKey isEqualToString:@"B"]||[jKey isEqualToString:@"I"]||[jKey isEqualToString:@"序号"]||[jKey isEqualToString:aValue]||[jKey isEqualToString:bValue]){

                    }

                    else{

                        id iValue = dic[iKey];

                        id jValue = dic[jKey];

                        NSLog(@"%i A:%@ B:%@ M:%@ N:%@ %@ %@ \n",count,a,b,[iKey stringByReplacingOccurrencesOfString:@"A" withString:@""],[jKey stringByReplacingOccurrencesOfString:@"A" withString:@""],iValue,jValue);


                        [xlsDataMuArr addObject:[NSString stringWithFormat:@"%i",count]];

                        [xlsDataMuArr addObject:[NSString stringWithFormat:@"%@",a]];

                        [xlsDataMuArr addObject:[NSString stringWithFormat:@"%@",b]];

                        [xlsDataMuArr addObject:[NSString stringWithFormat:@"%@",[iKey stringByReplacingOccurrencesOfString:@"A" withString:@""]]];

                        [xlsDataMuArr addObject:[NSString stringWithFormat:@"%@",[jKey stringByReplacingOccurrencesOfString:@"A" withString:@""]]];

                        [xlsDataMuArr addObject:[NSString stringWithFormat:@"%@",iValue]];

                        [xlsDataMuArr addObject:[NSString stringWithFormat:@"%@",jValue]];

                        count = count+1;

                    }

                }

            }

        }

    }

    //把数组拼接成字符串,连接符是 \t(功能同键盘上的tab键)

    NSString *fileContent =[xlsDataMuArr componentsJoinedByString:@"\t"];

    //字符串转换为可变字符串,方便改变某些字符

    NSMutableString *muStr =[fileContent mutableCopy];

    //新建一个可变数组,存储每行最后一个\t的下标(以便改为\n)

    NSMutableArray *subMuArr =[NSMutableArray array];

    for(int i = 0;i < muStr.length;i ++){

        NSRange range =[muStr rangeOfString:@"\t" options:NSBackwardsSearch range:NSMakeRange(i,1)];

        if(range.length == 1){

            [subMuArr addObject:@(range.location)];

        }

    }

    //替换末尾\t

    for(NSUInteger i = 0;i < subMuArr.count;i ++){


        if(i > 0 &&(i%columnCount == 0)){

            [muStr replaceCharactersInRange:NSMakeRange([[subMuArr objectAtIndex:i-1]intValue],1)withString:@"\n"];

        }

    }

    //文件管理器

    NSFileManager *fileManager =[[NSFileManager alloc]init];

    //使用UTF16才能显示汉字;如果显示为#######是因为格子宽度不够,拉开即可

    NSData *fileData =[muStr dataUsingEncoding:NSUTF16StringEncoding];

    //文件路径

    NSString *path = NSHomeDirectory();

    NSString *filePath =[path stringByAppendingPathComponent:@"/Documents/export.xls"];

    NSLog(@"文件路径:\n%@",filePath);

    //生成xls文件

    [fileManager createFileAtPath:filePath contents:fileData attributes:nil];

}


iOS 代码1


iOS代码2


iOS代码3

最后结果:


最后结果

340x600 = 204000数据也没有问题。

整个过程就是这样的,有点坎坷,整体来说还是比较顺利的。做完之后的感觉就是,嗯,好久没有遇到这么有意思的问题了,再就是遇到问题,不要轻易说放弃,一条路走不通,还有其他道路可以走,思路要灵活,多变,善于借助各种开发工具。平时应该广泛涉猎,各个技术层面多少都要看一点,关键时候还是可以派上用场的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,386评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,142评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,704评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,702评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,716评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,573评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,314评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,230评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,680评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,873评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,991评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,706评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,329评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,910评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,038评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,158评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,941评论 2 355

推荐阅读更多精彩内容