2012-01-02 99 views
0

我有一个简单的对象。它有几个NSString属性(propertyA,propertyB,propertyC)。Objective-C:将字符串解析为对象

我有以下形式的字符串(从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]; 

这个效果很好,但感觉很可怕的,哈克! 有没有人对我如何改进代码有任何建议?

+0

CSV是一个肮脏的文件格式,让你有一个肮脏的代码来解析。但是,你可以将数据文件从csv更改为json吗? – CarlJ 2012-01-02 14:54:27

+0

csv非常可怕...在这种情况下使用它有很好的理由。 – NeilD 2012-01-02 14:56:36

+0

所以只有肮脏的方式... – CarlJ 2012-01-02 14:57:14

回答

0

下面是一个CSV解析过去用于处理CSV数据的NSString扩展。

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

如果基本上增加了一个-(NSArray *)csvRows方法的NSString,它返回一个NSArray中与您的数据每行和每列来处理的列内的NSArray。 这是迄今为止我发现的最简单,最清洁的方式来处理出现的ocasional CSV数据。

0

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

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

+0

它得到我正确的数据,但感觉真的很脏:) – NeilD 2012-01-02 15:26:39

+0

哈。了解。虽然有时脏数据只是肮脏的。你可以使用一个CSV解析库,但如果你确信数据将保持现有格式(当然是一个大的“if”),我不确定你会从中得到多少(除了要维护的额外文件外)。我的2美分。 – 2012-01-02 15:51:40

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:方法MyObject调用setValuesForKeysWithDictionary。这将有助于简化的东西远一点,让你最后两行写上面一行:

MyObject obj = [[MyObject alloc] initWithDictionary:dict];