使用Objective C从CSV文件创建数组

时间:2012-04-18 16:47:36

标签: objective-c xcode

我是编码的新手所以请原谅我这是一个简单的问题。

我正在尝试在地图上绘制坐标。

我想读取CSV文件并将信息传递给两个单独的数组。

第一个数组将是NSArray * towerInfo(包含纬度,经度和塔标题)

第二个,NSArray *区域(包含塔标题和区域),其计数索引与第一个数组相同。

基本上,我相信我需要;

1)将文件读取为字符串.....

2)将字符串分成一个临时数组,分隔每个/ n / r ......

3)循环访问临时数组并在每次将此信息附加到两个主存储阵列之前创建塔和区域对象。

这是正确的过程,如果有的话,那里有人可以发布一些示例代码,因为我真的很难做到这一点。

提前感谢所有人。

克里斯。

我编辑了这个以显示我的代码示例。我遇到的问题是我收到警告说

1)“'dataStr'的本地声明隐藏了实例变量。 2)“'array'的本地声明隐藏了实例变量。

我想我明白这些意思,但我不知道如何绕过它。程序编译并运行,但日志告诉我“数组为空。”

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

@synthesize dataStr;
@synthesize array;

-(IBAction)convert {
//calls the following program when the onscreen 'convert' button is pressed.

    NSString *dataStr = [NSString stringWithContentsOfFile:@"Towers.csv" encoding:NSUTF8StringEncoding error:nil];
    //specifies the csv file to read - stored in project root directory - and encodes specifies that the format of the file is NSUTF8. Choses not to return an error message if the reading fails

    NSArray *array = [dataStr componentsSeparatedByString: @","];
    //splits the string into an array by identifying data separators.

    NSLog(@"array: %@", array);
    //prints the array to screen

}

非常感谢任何其他帮助。感谢到目前为止的回复。

3 个答案:

答案 0 :(得分:6)

NSString* fileContents = [NSString stringWithContentsOfURL:filename ...];
NSArray* rows = [fileContents componentsSeparatedByString:@"\n"];
for (...
    NSString* row = [rows objectAtIndex:n];
    NSArray* columns = [row componentsSeparatedByString:@","];
...

你可能想要输入一些“stringTrimmingCharactersInSet”调用来修剪空格。

答案 1 :(得分:1)

关于你的警告:

您的代码会产生错误(而不是警告),因为您需要在实现中合成它们之前在接口文件中声明属性。您可能还记得@synthesize为您的属性生成访问器方法。此外,在使用@synthesize指令之前,您还需要在界面中使用@property指令。 这是一个例子:

@interface MyObject : NSObject {
    NSString *myString;
}
@property (assign) NSString *myString;
@end

@implementation MyObject
@synthesize myString;
  // funky code here
@end

请注意,属性声明后跟一个类型(在这种情况下为assign,这是默认值)。在Stephen G. Kochans的书中有一个很好的解释:Programming in Objective-C 2.0


但是为了争论,假设你在这里省略了正确的@interface文件。 如果您首先在@interface中声明一个属性,然后使用相同的变量名称在方法中声明另一个属性,则方法变量将优先于实例变量。

在你的代码中,省略声明变量名就足够了,如下所示:

dataStr = [NSString stringWithContentsOfFile:@"Towers.csv" encoding:NSUTF8StringEncoding error:nil];    
array = [dataStr componentsSeparatedByString: @","];

答案 2 :(得分:0)

我假设您问题的核心是“如何解析CSV文件”,而不是“解析后如何处理数据”。如果是这种情况,请查看CHCSVParser库。我之前在项目中使用它并发现它非常可靠。它可以将任意字符串或文件路径解析为行/列的NSArray。在那之后,无论你对数据做什么都取决于你。