2010-10-07 36 views
2

我有一个应用程序,它导入一个.CSV文件并将每行都转换为存储在数据库中的核心数据对象。我要导入的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文件类型优雅方式,只是一组代码创建核心数据对象?

谢谢!

回答

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

但这仅仅是第一步,这仅支持一个非常简单的FILEFORMAT。具有“;”的单元格里面不支持。

如果CSV格式是这样的:firstname ; lastname ; zip ; age
和要导入名字,姓氏和年龄您创建这样

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

的importformat那么你会用钥匙名字得到一个NSDictionary,姓氏,年龄。如果格式更改,则只需使用importformat重新排列数组。

0

你有没有考虑用适当的字段和位置数组来组建一张表。当出现不同的格式时追加一个新的集合。在生成代码时使用数据(输入参数是Set_Id)?

相关问题