这是我用mac编程任何东西的第一次尝试。学习曲线陡峭。我有一个.csv文件,其中有几列ascii数据组织空白字段,用户名,名称(格式为“姓氏,名字中间名”),赋值1级(整数),赋值2级(整数)....赋值n等级(整数),平均等级(丢弃一个等级),部分编号(整数)。 代替成绩,他们可能是作业栏中的文字条目:我生病,X免除等。 我需要按部分计算每个作业的成绩平均值。 I'e。第9999部分学生的平均成绩为 __ 。我已经研究了各种解析方案,但是在我对目标c的理解中,知道如何使用它们更加复杂,更不用说它们如何工作了。所以我正在联系更具体和更不普遍的东西。
我已经编写了一些代码来将文件读入一个长字符串。 我已经编写了代码来将字符串分解为一系列代码行(学生的成绩为n) 我在如何将线阵列分解成2d数组项目方面受到阻碍。 一旦我完成了这项工作,我想通过查看每个任务的每个等级列来计算每个任务的部分平均值。如果该行的学生在我正在计算的部分中我想要对数字等级求和,跳过任何S或X条目并除以数字条目的数量以获得该作业的平均值。
最终,我将输出一个csv文件,其中包含部门编号,每个作业的平均成绩,每个作业的累积成绩。
因此,对于我的第一个问题,如何将数组分解为项目以及如何使用数字索引访问单个项目?任何建设性的指导都将得到最优雅的接受。
这是我到目前为止所做的:
// main.m
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool
{
// insert code here...
// beginning of sample code ************************************
// content is a pointer to a string containing all the data from the file
// contentarray is a pointer to an array where each index is a line from the file (separated by \n
// itemarray is a pointer to an array where the primary index - row is the nth line of the file and column is the nth item in the line.
NSInteger itemcount, rowcount;
NSString *pathwithgradefile = @"/some_path/sampledata.csv";
// NSError *error = nil;
NSString *content = [NSString stringWithContentsOfFile:pathwithgradefile encoding:NSUTF8StringEncoding error:nil];
NSLog(@"%@",content);
Make array of lines from the file - This part works.
NSArray *contentArray = [content componentsSeparatedByString:@"\n"]; // csv file line ends with newline
// output check of contentarray.
NSLog(@" \nlist contentArray line by line\n");
rowcount=0;
for (NSString *item in contentArray) {
// display item
NSLog(@"\n\r");
NSLog(@"row count: %lid Content: %@",rowcount, [contentArray objectAtIndex:rowcount]);
rowcount++; // this section works
}
// parse into 2d array with rows and items in each row
// this section is bogus - I am really clueless on how to proceed.
itemcount=0;
for (NSString *item in contentArray) {
NSArray *itemArray = [item componentsSeparatedByString:@","];
// log first item
NSLog(@"\n\r");
NSLog(@"item count: %lid Content: %@",itemcount, [itemArray objectAtIndex:rowcount]);
itemcount++;
}
}
return 0;
}
答案 0 :(得分:0)
如果您的数据不是连续的或者您想要使用的数字索引中存在间隙,那么最好使用带有NSNumber键的字典。像这样的东西可能会做你想要的。
NSMutableDictionary *outputData = [NSMutableDictionary dictionaryWithCapacity: 5];
NSUInteger sectionColumnIndex = 3; // What ever column you want to use as the top level
for (NSString *item in contentArray) {
NSArray *itemArray = [item componentsSeparatedByString:@","];
NSNumber *sectionNumber = [NSNumber numberWithInt:[[itemArray objectAtIndex: sectionColumnIndex] intValue]];
if(![outputData objectForKey: sectionNumber]){
NSMutableArray *sectionEntries = [NSMutableArray arrayWitCapacity: 5];
[outputData setObject: sectionEntries forKey: sectionNumber];
}
NSMutableArray *sectionEntries = [outputData objectForKey: sectionNumber];
[sectionEntries addObject: itemArray];
}
注意:这可能有拼写错误,但应该让你开始。