导入多种格式时保持列数据的最佳方法

时间:2010-10-07 12:54:57

标签: iphone objective-c core-data

我有一个导入.CSV文件的应用程序,并将每一行转换为存储在数据库中的Core Data对象。我导入的CSV文件大约有40个列,每列都映射到Core Data对象的属性。

当我启动项目时,我只使用了一种CSV格式,所以我只写了40行非优雅的静态代码来导入文件,例如:

...
newEntity.yearOfConstruction      = [NSNumber numberWithInt:[[currentRow objectAtIndex:35] integerValue]];
newEntity.assessedValue           = [NSNumber numberWithInt:[[currentRow objectAtIndex:36] integerValue]];
newEntity.squareFootageOfProperty = [NSNumber numberWithInt:[[currentRow objectAtIndex:37] integerValue]];
...

现在我遇到的问题是我想要导入其他CSV文件格式,这些格式的排序方式与我原来的用例不同。

不是编写switch(CSVFormatType)并添加额外的40行代码,而是以优雅方式存储任意数字CSV的CSV列到核数据映射文件类型和一组代码来创建Core Data对象?

谢谢!

2 个答案:

答案 0 :(得分:0)

您是否考虑使用适当数量的字段和位置构建表格。出现不同格式时附加新集。在生成代码时使用数据(输入参数是Set_Id)?

答案 1 :(得分:0)

我正在研究类似的东西。基本上我创建了一个格式数组,其中包含我想要创建的NSDictionary的键,这些键的索引与csv文件中的列匹配。
这就是我现在所拥有的:

+ (NSArray *)arrayFromCSV:(NSString *)csv format:(NSArray *)format ignoreHeader:(BOOL)ignore {
    NSArray *dataRows = [csv componentsSeparatedByString:@"\n"];
    NSArray *checkrow = [[dataRows objectAtIndex:0] componentsSeparatedByString:@";"];
    NSInteger expectedRowComponents = [checkrow count];
    if ([format count] > expectedRowComponents) {
            // more format keys than components
            return nil;
    }
    NSMutableArray *returnArray = [NSMutableArray array];
    for ( NSInteger i = 0; i < [dataRows count]; i++ ) {
            if (i == 0 && ignore)
                    // ignore first line in csv, "header"
                    continue;
            NSString *row = [dataRows objectAtIndex:i];
            NSArray *rowComponents = [row componentsSeparatedByString:@";"];
            if ( [rowComponents count] != expectedRowComponents )
                continue;
            NSMutableDictionary *tmpDict = [NSMutableDictionary dictionary];
            for ( NSInteger j = 0; j < [format count]; j++ ) {
                if ( [format objectAtIndex:j] != [NSNull null] ) {
                            [tmpDict setObject:[rowComponents objectAtIndex:j] forKey:[format objectAtIndex:j]];
                }
            }
            [returnArray addObject:tmpDict];
        }
    NSLog(@"%@", csv);
    NSLog(@"%@", returnArray);
    return returnArray;
}

但这只是第一步,它只支持一个非常简单的文件格式。单词格式为“;”里面不受支持。

如果csv格式如下:firstname ; lastname ; zip ; age
并且您想导入firstname,lastname和age,您可以创建一个像这样的

的importformat
format = [NSArray arrayWithObjects: @"firstname", @"lastname", [NSNull null], @"age", nil];

然后你会得到一个带有密钥firstname,lastname,age的NSDictionary。如果格式发生变化,您只需使用importformat重新排列数组。