使用NScanner将CSV文件解析为字典数组

时间:2013-05-12 00:41:50

标签: ios objective-c nsarray nsdictionary nsscanner

我创建了一个iPhone应用程序,它有一个位置字典数组(lat,long,point)。我通过手动输入每个值来创建数组。

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分:1)

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

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

使用像CHCSVParser这样的库,它将涵盖这些陷阱。