2016-03-08 140 views
0

我有一個作爲CSV文件導出的Excel文件。Objective-C,用逗號正確分隔CSV中的列

列中的一些數據也有逗號。 CSV通過將該字符串放在引號(「」)中來轉義這些字符串。但是,當我嘗試在Objective-C中解析它時,字符串內的逗號分隔數據,就好像它是一個新列。

這是我有:

self.csvData = [NSString stringWithContentsOfURL:file encoding:NSASCIIStringEncoding error:&error]; 

//This is what the data looks like: 
//"123 Testing (Sesame Street, Testing)",Hello World,Foo,Bar 

//Get rows 
NSArray *lines = [self.csvData componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]; 

//Get columns 
NSArray *columns = [[lines objectAtIndex:0] componentsSeparatedByString:@","]; 

//Show columns 
for (NSString *column in columns) { 
    NSLog(@"%@", column); 
} 

//Console shows this: 
"123 Testing (Sesame Street 
Testing)" 
Hello World 
Foo 
Bar 

注意如何"123 Testing (Sesame StreetTesting)"是作爲單獨的列輸出。我需要這些成爲一個。有任何想法嗎?

+0

的可能的複製[如何通過,(逗號)使用正則表達式中的iPhone應用到單獨的字符串](http://stackoverflow.com/questions/9083616/how-to-use-regular-表達功能於iphone應用內對獨立的串逐逗號) –

回答

0

任何想法?

設計算法。

在你有三種可能性中的一個輸入的開始:

  1. 你有" - 解析引述場
  2. 你有, - 處理一個空場
  3. 否則 - 解析一個未引用的字段

解析之後,如果還有更多的輸入,則迭代(循環)。

你可能有一些變量開始:

NSUInteger position = 0;    // current position 
NSUInteger remaining = csvData.length; // left to parse 

然後輸入你的循環:

while(remaining > 0) 
{ 

獲得下一個字符:

unichar nextChar = [csvData characterAtIndex:position]; 

現在是否該字符是一個",或其他東西。您可以使用ifswitch

假設這是一個逗號,那麼你想找到下一個逗號的位置。 NSString方法rangeOfString:options:range會給你。此方法的最後一個參數是一個範圍,指定要搜索逗號的字符串的哪一部分。您可以使用NSMakeRange和從positionremaining派生的值構造該範圍。

一旦你有下一個逗號,你需要提取字段,substringWithRange:方法可以幫你。

根據需要最後更新positionremaining並且您已準備好進行下一次迭代。

您必須處理一些錯誤情況 - 例如開盤報價沒有收盤價。總的來說,這很簡單。

如果您開始使用此路徑並且不起作用,請提出一個新問題,顯示您的代碼並解釋您卡在哪裏。

HTH