我有一个导入.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对象?
谢谢!
答案 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,您可以创建一个像这样的
format = [NSArray arrayWithObjects: @"firstname", @"lastname", [NSNull null], @"age", nil];
然后你会得到一个带有密钥firstname,lastname,age的NSDictionary。如果格式发生变化,您只需使用importformat重新排列数组。