我有一个简单的对象。它有几个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];
这很好用,但感觉非常可怕和黑客! 有没有人对我如何改进代码有任何建议?
答案 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