昨天朋友找我甩牺,讓我?guī)臀医o她處理幾個(gè)數(shù)據(jù)蘑志,然后就給了我原始數(shù)據(jù)的excel表格:
下邊來解釋下,表格中數(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)入,
我思考了一下,其實(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();?
很顯然被济,查到的結(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();?
很顯然 還是不對(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());
? ? }
}
?瀏覽器 先看一下效果鞠绰,
?有數(shù)據(jù),但是仔細(xì)看飒焦,不太對(duì)蜈膨,只取到了前四列屿笼,也就是列名不是數(shù)字的列,列名為數(shù)字的列一個(gè)沒有翁巍,問了一下別人驴一,說可能列名為數(shù)字,取數(shù)據(jù)的時(shí)候 集合的下標(biāo)也是數(shù)字灶壶,所以取不到肝断,朋友建議我改為字母,比如每個(gè)前邊加A驰凛,‘1’變?yōu)椤瓵1’胸懈。
改,同時(shí)我把表名也改了恰响,改為英文字母的趣钱,
再重新搜索,
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());
? ? }
}
結(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;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
}
控制臺(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);
再運(yùn)行:
輸出也沒有問題军掂,問了一下,最后想要的還是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];
}
最后結(jié)果:
340x600 = 204000數(shù)據(jù)也沒有問題葱蝗。
整個(gè)過程就是這樣的穴张,有點(diǎn)坎坷,整體來說還是比較順利的两曼。做完之后的感覺就是皂甘,嗯,好久沒有遇到這么有意思的問題了悼凑,再就是遇到問題偿枕,不要輕易說放棄璧瞬,一條路走不通,還有其他道路可以走渐夸,思路要靈活嗤锉,多變,善于借助各種開發(fā)工具捺萌。平時(shí)應(yīng)該廣泛涉獵档冬,各個(gè)技術(shù)層面多少都要看一點(diǎn),關(guān)鍵時(shí)候還是可以派上用場(chǎng)的桃纯。