多思路解決數(shù)據(jù)分析問題

昨天朋友找我甩牺,讓我?guī)臀医o她處理幾個(gè)數(shù)據(jù)蘑志,然后就給了我原始數(shù)據(jù)的excel表格:

部分原始數(shù)據(jù)截圖

下邊來解釋下,表格中數(shù)據(jù)含義贬派。第一列‘序號(hào)’急但,自動(dòng)生成,不用管搞乏;

A列波桩,B列,數(shù)據(jù)為后邊的列名请敦,比如第一行數(shù)據(jù)镐躲,A的值為1,這個(gè)‘1’就是后邊的列名為‘1’的數(shù)據(jù)侍筛,就是9萤皂,B的值為4,這個(gè)4就是后邊列名為‘4’的數(shù)值匣椰,就是9裆熙;

‘I’列,這里暫時(shí)沒用到禽笑,先不用管了入录;

需求,除了‘編號(hào)’佳镜、‘A’僚稿、‘B’、‘I’列邀杏,以及 ‘A’贫奠、‘B’ 對(duì)應(yīng)數(shù)值所占用的列以外唬血,在剩余的列中(這里是25列),每次隨機(jī)取兩列唤崭,計(jì)算出所有組合拷恨,把組合的列名以及列對(duì)應(yīng)的數(shù)據(jù)導(dǎo)出。


好了 需求定了谢肾,下一步就是漫長(zhǎng)的解決方案之路:

第一次腕侄,EXCEL直接解決,

?我分析了表格的數(shù)據(jù)芦疏,如果用Excel的隨機(jī)函數(shù)冕杠,太麻煩(好像也實(shí)現(xiàn)不了),每一行的組合是 25x24=600 個(gè)可能的組合;生成的時(shí)候還要考慮第一個(gè) 和第二個(gè)取到的是否一樣,這不現(xiàn)實(shí),果斷放棄;

第二次,mysql數(shù)據(jù)庫工具直接處理:

正好之前下載了數(shù)據(jù)庫工具,Navicat ,直接把數(shù)據(jù)導(dǎo)入,

Excel數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫

我思考了一下,其實(shí)現(xiàn)在要做的就是 從27列中,依次取兩列,保證這兩列不相同,同時(shí)也不是A酸茴、B兩列中的數(shù)據(jù)即可分预;所以現(xiàn)在要做的就是循環(huán)取數(shù)據(jù),這里有個(gè)很巧的地方是 要用的列名正好是數(shù)字薪捍,試了一下笼痹,SELECT `13` FROM `3D-澳利華-地表`; 嗯,是沒有問題的酪穿;


搜索一列試試

接下來就是寫循環(huán)語句凳干,上網(wǎng)查了一下 原來是一個(gè) 存儲(chǔ)過程,先查一行試試

?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();?


存儲(chǔ)過程

很顯然被济,查到的結(jié)果不對(duì)救赐,我想要的是是第N 行數(shù)據(jù),這里返回的直接是 N只磷。懷疑是 num這個(gè) 沒有加反引號(hào)導(dǎo)致经磅,再試

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();?


存儲(chǔ)過程

很顯然 還是不對(duì),問了相關(guān)朋友喳瓣,讓我試試`@num`,@`num`,均以失敗告終馋贤;這第一步都都不通,剩下的都不用說了畏陕,放棄;

第三次仿滔,PHP導(dǎo)入

數(shù)據(jù)已經(jīng)導(dǎo)入本地?cái)?shù)據(jù)庫惠毁,正好機(jī)器上有 PhpStorm,寫代碼導(dǎo)入數(shù)據(jù)崎页;

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代碼

?瀏覽器 先看一下效果鞠绰,


瀏覽器效果圖

?有數(shù)據(jù),但是仔細(xì)看飒焦,不太對(duì)蜈膨,只取到了前四列屿笼,也就是列名不是數(shù)字的列,列名為數(shù)字的列一個(gè)沒有翁巍,問了一下別人驴一,說可能列名為數(shù)字,取數(shù)據(jù)的時(shí)候 集合的下標(biāo)也是數(shù)字灶壶,所以取不到肝断,朋友建議我改為字母,比如每個(gè)前邊加A驰凛,‘1’變?yōu)椤瓵1’胸懈。

改,同時(shí)我把表名也改了恰响,改為英文字母的趣钱,


數(shù)據(jù)庫改列名后

再重新搜索,

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代碼修改后

結(jié)果

瀏覽器顯示

這回就沒有問題了胚宦,數(shù)據(jù)都有羔挡。

本來是打算用php直接實(shí)現(xiàn)來的,奈何初學(xué)间唉,玩不轉(zhuǎn)绞灼,還是用自己熟悉的Objective-c來實(shí)現(xiàn)吧

直接上代碼吧,獲取到數(shù)據(jù)后的 數(shù)據(jù)分析實(shí)現(xiàn)呈野,還是先拿一條數(shù)據(jù)實(shí)驗(yàn):

-(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:@"序號(hào)"]||[iKey isEqualToString:aValue]||[iKey isEqualToString:bValue]||[jKey isEqualToString:@"A"]||[jKey isEqualToString:@"B"]||[jKey isEqualToString:@"I"]||[jKey isEqualToString:@"序號(hào)"]||[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代碼

控制臺(tái)輸出結(jié)果:


打印臺(tái)結(jié)果

正好600條低矮,應(yīng)該是沒有問題的。

下一步就是導(dǎo)出被冒,上網(wǎng)查到最簡(jiǎn)單的就是 控制臺(tái)輸出為日志:

?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];


? ? //先刪除已經(jīng)存在的文件

? ? NSFileManager *defaultManager =[NSFileManager defaultManager];

? ? [defaultManager removeItemAtPath:logFilePath error:nil];


? ? //將log輸入到文件

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

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


iOS代碼

再運(yùn)行:


控制臺(tái)輸出

輸出也沒有問題军掂,問了一下,最后想要的還是excel表格數(shù)據(jù)昨悼,重新導(dǎo)出:

-(void)createXLSFile {

? ? //創(chuàng)建存放XLS文件數(shù)據(jù)的數(shù)組

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

? ? //第一行內(nèi)容

? ? [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;

? ? //加入數(shù)據(jù);

? ? 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:@"序號(hào)"]||[iKey isEqualToString:aValue]||[iKey isEqualToString:bValue]||[jKey isEqualToString:@"A"]||[jKey isEqualToString:@"B"]||[jKey isEqualToString:@"I"]||[jKey isEqualToString:@"序號(hào)"]||[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;

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? }

? ? }

? ? //把數(shù)組拼接成字符串蝗锥,連接符是 \t(功能同鍵盤上的tab鍵)

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

? ? //字符串轉(zhuǎn)換為可變字符串,方便改變某些字符

? ? NSMutableString *muStr =[fileContent mutableCopy];

? ? //新建一個(gè)可變數(shù)組率触,存儲(chǔ)每行最后一個(gè)\t的下標(biāo)(以便改為\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才能顯示漢字终议;如果顯示為#######是因?yàn)楦褡訉挾炔粔颍_即可

? ? 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

最后結(jié)果:


最后結(jié)果

340x600 = 204000數(shù)據(jù)也沒有問題葱蝗。

整個(gè)過程就是這樣的穴张,有點(diǎn)坎坷,整體來說還是比較順利的两曼。做完之后的感覺就是皂甘,嗯,好久沒有遇到這么有意思的問題了悼凑,再就是遇到問題偿枕,不要輕易說放棄璧瞬,一條路走不通,還有其他道路可以走渐夸,思路要靈活嗤锉,多變,善于借助各種開發(fā)工具捺萌。平時(shí)應(yīng)該廣泛涉獵档冬,各個(gè)技術(shù)層面多少都要看一點(diǎn),關(guān)鍵時(shí)候還是可以派上用場(chǎng)的桃纯。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末酷誓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子态坦,更是在濱河造成了極大的恐慌盐数,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伞梯,死亡現(xiàn)場(chǎng)離奇詭異玫氢,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)谜诫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門漾峡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人喻旷,你說我怎么就攤上這事生逸。” “怎么了且预?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵槽袄,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我锋谐,道長(zhǎng)遍尺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任涮拗,我火速辦了婚禮乾戏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘多搀。我一直安慰自己歧蕉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布康铭。 她就那樣靜靜地躺著,像睡著了一般赌髓。 火紅的嫁衣襯著肌膚如雪从藤。 梳的紋絲不亂的頭發(fā)上催跪,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音夷野,去河邊找鬼懊蒸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛悯搔,可吹牛的內(nèi)容都是我干的骑丸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼妒貌,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼通危!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起灌曙,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤菊碟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后在刺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逆害,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年蚣驼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了魄幕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡颖杏,死狀恐怖纯陨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情输玷,我是刑警寧澤队丝,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站欲鹏,受9級(jí)特大地震影響机久,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赔嚎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一膘盖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧尤误,春花似錦侠畔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至尤勋,卻和暖如春喘落,著一層夾襖步出監(jiān)牢的瞬間茵宪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工瘦棋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留稀火,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓赌朋,卻偏偏與公主長(zhǎng)得像凰狞,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子沛慢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容