2016-03-08 141 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