昨天朋友找我,让我帮我给她处理几个数据,然后就给了我原始数据的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 ,直接把数据导入,
我思考了一下,其实现在要做的就是 从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());
}
}
浏览器 先看一下效果,
有数据,但是仔细看,不太对,只取到了前四列,也就是列名不是数字的列,列名为数字的列一个没有,问了一下别人,说可能列名为数字,取数据的时候 集合的下标也是数字,所以取不到,朋友建议我改为字母,比如每个前边加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直接实现来的,奈何初学,玩不转,还是用自己熟悉的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;
}
}
}
}
}
控制台输出结果:
正好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);
再运行:
输出也没有问题,问了一下,最后想要的还是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];
}
最后结果:
340x600 = 204000数据也没有问题。
整个过程就是这样的,有点坎坷,整体来说还是比较顺利的。做完之后的感觉就是,嗯,好久没有遇到这么有意思的问题了,再就是遇到问题,不要轻易说放弃,一条路走不通,还有其他道路可以走,思路要灵活,多变,善于借助各种开发工具。平时应该广泛涉猎,各个技术层面多少都要看一点,关键时候还是可以派上用场的。