0

这是我第一次尝试用 mac 编程。学习曲线陡峭。我有一个 .csv 文件,其中包含几列 ascii 数据组织的空白字段、用户名、姓名(格式为“姓氏、名字中间名”)、作业 1 级(整数)、作业 2 级(整数).... 作业n 等级(整数),平均等级(下降一个等级),部分编号(整数)。代替等级,它们可能是作业栏中的文本条目:I 代表生病,X 代表豁免等。我需要按部分计算每个作业的平均成绩。IE。第 9999 节学生的平均成绩是__ 。. 我已经查看了各种解析方案,但在我对目标 c 的理解中,这些方案太复杂了,无法知道如何使用它们,更不用说它们是如何工作的了。因此,我正在链接一些更具体、更不普遍的东西。

我已经编写了一些代码来将文件读入一个长字符串。我已经编写了将字符串分解为代码行数组的代码(学生 n 评分),我对如何将行数组分解为二维项目行数组感到困惑。完成后,我想通过查看单个作业的每一列成绩来计算每个作业的部分平均值。如果该行的学生在我正在计算的部分中,我想对数字成绩求和,跳过任何 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;

}
4

1 回答 1

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

注意:这可能有错别字,但应该让你开始。

于 2013-04-11T18:12:34.453 回答