Objective-C:将字符串解析为对象

时间:2012-01-02 14:52:17

标签: objective-c parsing

我有一个简单的对象。它有几个NSString属性(propertyA,propertyB,propertyC)。

我有一个字符串(从csv文件中读取),格式如下:

this is value A, this is value B, this is value C
another row A, another row B

请注意,第二行缺少最后一个属性。

我想将字符串解析为我的对象。目前我正在从csv文件中获取一行,然后执行此操作:

MyObject *something = [[MyObject alloc] init];
NSArray *split = [line componentsSeparatedByString:@","];

if (something.count > 0)
    something.propertyA = [split objectAtIndex:0];

if (something.count > 1) 
    something.propertyB = [split objectAtIndex:1];

if (something.count > 2)
    something.propertyC = [split objectAtIndex:2];

这很好用,但感觉非常可怕和黑客! 有没有人对我如何改进代码有任何建议?

4 个答案:

答案 0 :(得分:2)

看一下解析CSV Where can I find a CSV to NSArray parser for Objective-C?

的这一步

Dave DeLong写了一个CSV解析器库,你可以在这里找到它:https://github.com/davedelong/CHCSVParser

希望这会有所帮助:)

答案 1 :(得分:0)

这是我过去用来处理CSV数据的NSString的CSV解析扩展。

http://www.macresearch.org/cocoa-scientists-part-xxvi-parsing-csv-data

如果基本上向NSString添加一个-(NSArray *)csvRows方法,该方法返回一个NSArray,其中包含数据中的每一行,并且每行内部都有一个NSArray来处理列。 这是迄今为止我发现的最简单,最干净的方法来处理出现的偶然CSV数据。

答案 2 :(得分:0)

考虑到文件的输入格式,并且假设没有单个项目本身实际上包含逗号,您的方法实际上看起来很合理。正如其他人所提到的,CSV和/或自定义平面文件需要自定义解决方案才能从中获得您想要的内容。

如果上面的方法可以获得您想要的数据,那么我说使用它。如果不是,也许你可以分享你遇到的实际问题(即你得到的数据是什么,你期待什么?)

答案 3 :(得分:0)

考虑使用与MyObject属性名称对应的键数组。例如:

NSString *propertyNames[] = { @"property1", @"property2", @"property3" };

NSArray *values = [line componentsSeparatedByString:@","];
NSArray *keys = [NSArray arrayWithObjects:propertyNames count:[values count]];
NSDictionary *dict = [NSDictionary dictionaryWithObjects:values forKeys:keys];

MyObject obj = [[MyObject alloc] init];
[obj setValuesForKeysWithDictionary:dict];

然后,您可以考虑向调用initWithDictionary:的{​​{1}}添加MyObject方法。这将有助于简化事情,允许您将上面的最后两行写成一行:

setValuesForKeysWithDictionary