-2

我创建了一个 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

我想通过使用 NScanner 解析 TestCSV.csv 来创建 myLocationArray(格式如图所示)。我已经设置解析我的数据文件。

NSString *pathToFile =[[NSBundle mainBundle] pathForResource:@"TestCSV" ofType: @"csv"];

NSString *fileString = [NSString stringWithContentsOfFile:pathToFile     encoding:NSUTF8StringEncoding error:nil];

if (!fileString) {
NSLog(@"Error reading file.");
}

NSScanner *scanner = [NSScanner scannerWithString:fileString];

不过我需要这里的帮助。我看过很多例子,但似乎这是我需要为我的应用程序定制一些代码的地方。在此先感谢您的时间。

4

2 回答 2

1

不要试图重新发明轮子,因为 CSV 文件格式存在一些缺陷(甚至没有特别明确的定义)。

例如,字段中存在换行符和逗号的特殊情况。给定这样的输入,任何仅基于行和逗号分割的算法都会产生不正确的结果。另请注意,Excel 并不总是使用逗号作为分隔符,具体取决于区域设置。

使用CHCSVParser 之类的库,它将涵盖这些陷阱。

于 2013-05-12T16:52:11.837 回答
1

我不明白你为什么要使用扫描仪,因为你的结构是如此简单和可预测。从一个空的 NSMutableArray 开始。您可以将文件拆分为如下行:

NSArray *lines = [input componentsSeparatedByString:@"\n"];

现在枚举该数组。对于每一行,您可以在逗号处拆分该行:

NSArray *nums = [oneLine componentsSeparatedByString:@","];

该数组nums是一个包含三个 NSString 值的数组。对于数组的前两项,将它们转换为双精度数并将其doubleValue包装在 NSNumber 中。为该行创建 NSDictionary 并将其添加到 NSMutableArray。

于 2013-05-12T04:11:25.487 回答