【问题标题】:Create a Custom Formatted Dictionary Array from CSV File of Data从 CSV 数据文件创建自定义格式的字典数组
【发布时间】:2013-05-06 03:17:06
【问题描述】:

我创建了一个 iPhone 应用程序,其中包含一个位置字典数组(纬度、经度、点)。我通过手动输入每个值来创建数组。

myLocationArray = @[
                 @{
                   kStation : @"1",
                   kLatitude : @( 41.656467),
                   kLongitude : @(-81.277963)
                   },
                 @{
                   kStation : @"2",
                   kLatitude : @(41.657118),
                   kLongitude : @(-81.276545)
                   },
                 @{
                   kStation : @"3",
                   kLatitude : @(41.658493),
                   kLongitude : @(-81.273542)
                   },
                  ...

这很好,但现在我想通过从 .CSV 文件中获取数据以编程方式创建这个数组。我有一个看起来像这样的 .CSV 文件 (TestCSV.csv)。

41.656467,-81.277963,27200
41.657118,-81.276545,27650
41.658493,-81.273542,28631.5
41.660728,-81.268547,30195
41.661830,-81.266065,30991
41.662828,-81.263819,31700
41.663677,-81.261962,32300
41.664578,-81.259909,32950
41.666210,-81.256312,34100
41.666921,-81.254708,34605
41.668043,-81.252191,35400
41.669044,-81.250043,36099
41.670120,-81.247495,36900
41.670778,-81.245957,37380
41.671459,-81.244292,37905
41.672028,-81.242832,38349
41.672487,-81.241702,38700
41.673106,-81.240175,39175
41.674364,-81.237007,40150
41.675170,-81.235038,40762.5
41.675716,-81.233698,41182
41.676143,-81.232614,41516

具体来说,我想通过直接从 TestCSV.csv 读取来创建 myLocationArray(格式如图所示)。我不熟悉实现这一目标的代码,并且非常感谢一些方向。

另外,如果数据是通过文本文件而不是 csv 提供的,是否会有所不同或更容易?

【问题讨论】:

  • 您是否对解析 CSV 文件进行过搜索?这里有很多问题,或者在 Google 上可以找到,可以帮助您使用 Objective-C 解析 CSV 文件。
  • 直接复制您自己的问题 - 请不要这样做

标签: ios objective-c nsstring nsarray nsfilemanager


【解决方案1】:

试试

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Locations" ofType:@"csv"];
NSString *csvString = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];

NSArray *locations = [csvString componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];

NSMutableArray *locationsArray = [NSMutableArray array];
for (NSString * location in locations)
{

    NSArray *components = [location componentsSeparatedByString:@","];

    double latitude   = [components[0] doubleValue];
    double longitude  = [components[1] doubleValue];
    NSString *station =  components[2];

    NSDictionary *dict = @{@"kLatitude": @(latitude),
                           @"kLongitude": @(longitude),
                           @"kStation": station};

    [locationsArray addObject:dict];

}

CSV File

答案启发from

【讨论】:

  • 我无法从中创建数组。在 filepath 中 pathForResource: 应该是 @"TestCSV" 因为那是包含我的数据的 csv 文件的名称?除此之外,我收到错误 *** Terminating app due to uncaught exception 'NSRangeException', reason: '** -[__NSArrayI objectAtIndex:]: index 3 beyond bounds [0 .. 2]'跨度>
  • 使用调试器和中断,我认为问题在于这个调用,[components enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { [dict setObject:obj forKey:keys[idx ]]; }];。我不确定这是如何工作的,但也许您可以理解为什么它会导致我在上一条评论中发布的错误。
  • @JBeesky 您是否使用了我提供的确切代码?一切对我来说都很好。首先检查我使用的 CSV。检查两者有什么不同。在枚举中,我使用了 idx 来查找密钥,如果 idx 超过 2,它将中断。如果您提供您使用的 CSV,会更容易。
  • 我更新了我的问题以显示我在项目中使用的实际 csv 文件数据。我不认为会有索引 3。
【解决方案2】:

csv 文件是纯文本文件。要实现您想要的,您可以使用NSScannerNSString componentsSeparatedByString: 其他一切都非常简单。

【讨论】:

  • 使用 componentsSeparatedByString: 解析 CSV 文件仅适用于非常特定的情况。如果值被引用并且值包含字段分隔符,它将不起作用。当值包含换行符时,它将不起作用。诚然,它可能适用于这种特定情况,因为此 CSV 文件似乎没有任何文本,但它不是解析 CSV 文件的有效通用解决方案。
  • 没有人要求通用解决方案。主题起始者给出了他想要解析的文件示例。可以用我提到的方法解析。当通用解决方案显然没有必要时,我不喜欢它们。
  • 我只是指出了您的答案的潜在缺点,以便将来可能找到您答案的人受益。请记住,人们会在很长一段时间内搜索并找到此类答案,并且此类用户可能有更普遍的需求。我在评论中说你的回答很适合这个用途。
  • 感谢大家的回复。我正在研究 NSSCanner。我会在做一些研究后报告。
  • 伙计们,我在以下链接中发布了一个新问题,以响应您使用 NSScanner 的建议。我也想保留这个问题,因为 Anupdas 的方法可能会奏效。请查看并评论stackoverflow.com/questions/16503084/…。感谢您的帮助。
【解决方案3】:

Anupdas 提供的答案。干杯!

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Locations" ofType:@"csv"];
NSString *csvString = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];

NSArray *locations = [csvString componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];

NSMutableArray *locationsArray = [NSMutableArray array];
for (NSString * location in locations)
{

NSArray *components = [location componentsSeparatedByString:@","];

double latitude   = [components[0] doubleValue];
double longitude  = [components[1] doubleValue];
NSString *station =  components[2];

NSDictionary *dict = @{@"kLatitude": @(latitude),
                       @"kLongitude": @(longitude),
                       @"kStation": station};

[locationsArray addObject:dict];

}

【讨论】:

    猜你喜欢
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2012-12-15
    相关资源
    最近更新 更多