成绩单的2d数组

时间:2013-04-11 17:29:42

标签: objective-c macos cocoa parsing csv

这是我用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;

}

1 个答案:

答案 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];
}        

注意:这可能有拼写错误,但应该让你开始。