Objective-C,用逗号正确分隔CSV中的列

时间:2016-03-08 18:34:30

标签: objective-c csv

我有一个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 StreetTesting)"如何作为单独的列输出。我需要这些是一个。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

  

有什么想法吗?

设计算法。

在输入开始时,您有以下三种可能之一:

  1. 您有" - 解析引用字段
  2. 您有, - 处理空字段
  3. 否则 - 解析非引用字段
  4. 解析后是否还有剩余输入然后迭代(循环)。

    您可以从一些变量开始:

    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会为您提供。此方法的最后一个参数是一个范围,指定要搜索逗号的字符串的哪个部分。您可以使用NSMakeRangepositionremaining派生的值来构建该范围。

    一旦你有了下一个逗号,你需要提取字段,substringWithRange:方法可以帮助你。

    最后根据需要更新positionremaining,您就可以进行下一次迭代了。

    您必须处理一些错误案例 - 例如打开报价,没有收盘报价。总的来说,这是直截了当的。

    如果你开始沿着这条路走下去并且它没有工作,请提出一个新问题,展示你的代码并解释你被卡住的地方。

    HTH