我有一个Excel文件,我将其导出为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)"
如何作为单独的列输出。我需要这些是一个。有什么想法吗?
答案 0 :(得分:0)
有什么想法吗?
设计算法。
在输入开始时,您有以下三种可能之一:
"
- 解析引用字段,
- 处理空字段解析后是否还有剩余输入然后迭代(循环)。
您可以从一些变量开始:
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