Objective c 在某些情况下使用双引号解析CSV

Objective c 在某些情况下使用双引号解析CSV,objective-c,parsing,csv,Objective C,Parsing,Csv,我有附带格式的csv: a1、a2、a3、“a4、a5”和a6 只有带有的字段才会有引号 使用Objective-C,如何轻松地解析它?我尽量避免使用开源CSV解析器作为公司政策。谢谢。我同意rmaddy的观点,即完整的csv解析算法超出了SO的范围,但是,这里有一种可能的解决方法: 将整行提取到一个NSString 迭代NSString,将每个字符推回另一个字符串 遇到逗号时,保存存储的字符串,忽略该逗号并创建新的空白字符串 重复上述步骤,直到行结束 设置标志以标识是否已找到双引号。如果设置了

我有附带格式的csv:

a1、a2、a3、“a4、a5”和a6

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


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

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

  • 将整行提取到一个
    NSString
  • 迭代
    NSString
    ,将每个字符推回另一个字符串
  • 遇到逗号时,保存存储的字符串,忽略该逗号并创建新的空白字符串
  • 重复上述步骤,直到行结束
  • 设置标志以标识是否已找到双引号。如果设置了该标志,则忽略步骤3。当找到第二组引号时,请取消设置该标志并像以前一样继续
  • 这通常适用于任何语言(使用它们各自的本机字符串类),这样的算法可以为完整的CSV解析器提供一个小的基础。但是,在这种特殊情况下,您可能不需要比此更多的功能


    对于一些示例代码,我鼓励您看一看,因为它演示了一种在Objective-C中拆分和存储字符串的方法。

    这段代码非常适合我

        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];
    
    BOOL quotesOn=false;
    NSString*行=@“a1、a2、a3、a4、a5、a6”;
    NSMutableArray*lineParts=[[NSMutableArray alloc]init];
    NSMutableString*linePart=[[NSMutableString alloc]init];
    对于(int i=0;i0)
    [lineParts添加对象:linePart];
    linePart=[[NSMutableString alloc]init];
    }
    if(quotesOn | | current!=',')
    [linePart appendString:[line substringWithRange:NSMakeRange(i,1)];
    }
    如果(linePart.length>0)
    [lineParts添加对象:linePart];
    

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

    带有换行符的字段值也将用引号括起来。解析所有可能的CSV格式比大多数人意识到的要困难得多。使用开源库(让您的生活更轻松)或咬紧牙关,编写您自己的所有代码来处理所有可能的问题。没有“为什么你的问题是完全重复的(除了替换Objective-C for Java)这是16个月前的一个问题:但我想在Objective-C中实现它。好吧,但你为什么不写你自己的问题。逐字复制另一个问题,包括标题、问题和标签似乎很奇怪。我的错,我的问题与此相同。我只想尽快得到一个解决方案。谢谢!我找到了一个解决方案。