2012-01-02 5 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

+0

csvはかなり恐ろしいです...しかし、この場合でもそれを使用するための良い理由があります。 – NeilD

+0

だから汚い道だけがある... – CarlJ

答えて

0

をここにCSVです過去にCSVデータを処理するために使用したNSStringの拡張機能を解析しています。

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

の場合、基本的には、データの各列と列を処理するために各列の内側にNSArrayとにNSArrayを返しNSStringのに-(NSArray *)csvRowsメソッドを追加します。 これは、今までに発見された事実上のCSVデータに対処するために私が見つけた、最もシンプルでクリーンな方法です。

0

あなたのアプローチは、ファイルの入力フォーマットを考えれば、実際にはかなり聞こえるようですが、個々のアイテムには実際にはカンマが含まれていないと仮定します。他の人が触れたように、CSVやカスタムフラットファイルには、必要なものを得るためのカスタムソリューションが必要です。

上記の方法で必要なデータが得られる場合は、それを使用してください。しかし、実際に発生している問題(つまり、どのデータが出ているのか、何を期待しているのか)を共有することは可能でしょうか。

+0

それは私に適切なデータを取得しますが、本当に汚い感じ:) – NeilD

+0

ハ。理解しています。しかし、時には汚れたデータがちょっと汚いこともあります。あなたはCSV解析ライブラリを使うことができますが、あなたが現在持っているフォーマットと同じフォーマットのままであることが確かであれば(もちろん「あれば」)、あなたはそれから多くを得ることはできません維持する余分なファイル以外)。私の2セント。 –

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]; 

その後、setValuesForKeysWithDictionaryを呼び出しMyObjectからinitWithDictionary:メソッドを追加することを検討できます。それはあなたが上記の単一の線として最後の2行を記述することができ、さらに少し物事を合理化に役立つだろう:

MyObject obj = [[MyObject alloc] initWithDictionary:dict]; 
関連する問題