Objective-C,用逗号正确分隔CSV中的列
问题描述:
我有一个作为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 Street
和Testing)"
是作为单独的列输出。我需要这些成为一个。有任何想法吗?
答
任何想法?
设计算法。
在你有三种可能性中的一个输入的开始:
- 你有
"
- 解析引述场 - 你有
,
- 处理一个空场 - 否则 - 解析一个未引用的字段
解析之后,如果还有更多的输入,则迭代(循环)。
你可能有一些变量开始:
NSUInteger position = 0; // current position
NSUInteger remaining = csvData.length; // left to parse
然后输入你的循环:
while(remaining > 0)
{
获得下一个字符:
unichar nextChar = [csvData characterAtIndex:position];
现在是否该字符是一个"
,,
或其他东西。您可以使用if
或switch
。
假设这是一个逗号,那么你想找到下一个逗号的位置。 NSString
方法rangeOfString:options:range
会给你。此方法的最后一个参数是一个范围,指定要搜索逗号的字符串的哪一部分。您可以使用NSMakeRange
和从position
和remaining
派生的值构造该范围。
一旦你有下一个逗号,你需要提取字段,substringWithRange:
方法可以帮你。
根据需要最后更新position
和remaining
并且您已准备好进行下一次迭代。
您必须处理一些错误情况 - 例如开盘报价没有收盘价。总的来说,这很简单。
如果您开始使用此路径并且不起作用,请提出一个新问题,显示您的代码并解释您卡在哪里。
HTH
的可能的复制[如何通过,(逗号)使用正则表达式中的iPhone应用到单独的字符串](http://stackoverflow.com/questions/9083616/how-to-use-regular-表达功能于iphone应用内对独立的串逐逗号) –