2012-01-02 47 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];