0

我有带有格式的csv:

a1, a2, a3, "a4,a5", a6

只有带 , 的字段才会有引号

使用Objective-C,如何轻松解析这个?我尽量避免使用开源 CSV 解析器作为公司政策。谢谢。

4

2 回答 2

1

我同意 rmaddy 的观点,即完整的 csv 解析算法超出了 SO 的范围,但是,这是解决此问题的一种可能方法:

  1. 将整行提取为NSString
  2. 遍历NSString,将每个字符推回另一个字符串。
  3. 当遇到逗号时,保存存储的字符串,忽略逗号并创建一个新的空白字符串。
  4. 重复直到行尾。
  5. 设置一个标志来标识是否找到了双引号。如果设置了标志,则忽略步骤 3。当找到第二组引号时,取消设置标志并像以前一样继续。

这通常适用于任何语言(使用它们各自的本机字符串类),并且这种算法可以构成完整 CSV 解析器的小基础。但是,在这种特殊情况下,您可能不需要比这更多的功能。

对于一些示例代码,我鼓励您查看我对这个与 CSV 相关的问题的回答,因为它演示了一种在 Objective-C 中拆分和存储字符串的方法。

于 2013-02-27T05:19:30.533 回答
0

这个片段对我来说非常有用......

    BOOL quotesOn = false;
    NSString* line = @"a1, a2, a3, "a4,a5", a6";
    NSMutableArray* lineParts = [[NSMutableArray alloc] init];
    NSMutableString* linePart = [[NSMutableString alloc] init];
    for (int i = 0; i < line.length; i++)
    {
        unichar current = [line characterAtIndex: i];
        if (current == '"')
        {
            quotesOn = !quotesOn;
            continue;
        }
        if (!quotesOn && current == ',')
        {
            if (linePart.length > 0)
                [lineParts addObject: linePart];
            linePart = [[NSMutableString alloc] init];
        }
        if (quotesOn || current != ',')
            [linePart appendString: [line substringWithRange: NSMakeRange(i, 1)]];
    }
    if (linePart.length > 0)
        [lineParts addObject: linePart];

我的 5 个元素在 lineParts 数组中......

于 2018-10-26T19:31:56.787 回答