使用 NScanner 将 CSV 文件解析为字典数组 [重复]
Posted
技术标签:
【中文标题】使用 NScanner 将 CSV 文件解析为字典数组 [重复]【英文标题】:Using NScanner to parse CSV File to Dictionary Array [duplicate] 【发布时间】:2013-05-12 00:41:49 【问题描述】:我创建了一个 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];
不过,我需要这里的帮助。我看过很多例子,但似乎这就是我需要为我的应用程序定制一些代码的地方。在此先感谢您的时间。
【问题讨论】:
【参考方案1】:我完全不明白您为什么要使用扫描仪,因为您的结构是如此简单和可预测。从一个空的 NSMutableArray 开始。您可以将文件分成如下几行:
NSArray *lines = [input componentsSeparatedByString:@"\n"];
现在枚举那个数组。对于每一行,您可以用逗号分隔该行:
NSArray *nums = [oneLine componentsSeparatedByString:@","];
数组nums
是一个包含三个 NSString 值的数组。对于数组的前两项,使用doubleValue
将它们转换为双精度数并将其包装在一个NSNumber 中。为该行创建 NSDictionary 并将其添加到 NSMutableArray。
【讨论】:
感谢您的回复。我实际上已经在研究这个选项。请在***.com/questions/16499180/… 看看我的问题。具体来说,Anupdas 的回答是我正在尝试并遇到的问题。 请不要重复同一个问题。【参考方案2】:不要尝试重新发明***,因为 CSV 文件格式存在一些缺陷(甚至没有特别明确的定义)。
例如,字段中存在换行符和逗号的特殊情况。给定这样的输入,任何仅基于行和逗号分割的算法都会产生不正确的结果。另请注意,Excel 并不总是使用逗号作为分隔符,具体取决于区域设置。
使用像CHCSVParser 这样的库,它会涵盖这些陷阱。
【讨论】:
以上是关于使用 NScanner 将 CSV 文件解析为字典数组 [重复]的主要内容,如果未能解决你的问题,请参考以下文章