在哪里可以找到针对Objective-C的NSArray解析器的CSV?

时间:2010-07-27 14:26:18

标签: iphone objective-c ios parsing

我正在寻找一种易于使用的Objective-C CSV解析器,以便在iPhone上使用。我在哪里可以找到一个?

我也在寻找其他解析器,例如JSON,所以也许某处有转换库。

8 个答案:

答案 0 :(得分:51)

我终于开始清理我在代码文件夹中的解析器并将其发布到Github上:http://github.com/davedelong/CHCSVParser

这是非常彻底的。它处理各种转义方案,字段中的换行符,注释等。它还使用智能文件加载,这意味着您可以在受限的内存条件下安全地解析大文件。

答案 1 :(得分:17)

这是NSString上的一个简单类别,用于解析在引号块中嵌入逗号的CSV字符串。

#import "NSString+CSV.h"

@implementation NSString (CSV)

- (NSArray *)componentsSeparatedByComma
{
    BOOL insideQuote = NO;
    NSMutableArray *results = [[NSMutableArray alloc] init];
    NSMutableArray *tmp = [[NSMutableArray alloc] init];

    for (NSString *s in [self componentsSeparatedByString:@","]) {
        if ([s rangeOfString:@"\""].location == NSNotFound) {
            if (insideQuote) {
                [tmp addObject:s];
            } else {
                [results addObject:s];
            }
        } else {
            if (insideQuote) {
                insideQuote = NO;
                [tmp addObject:s];
                [results addObject:[tmp componentsJoinedByString:@","]];
                tmp = nil;
                tmp = [[NSMutableArray alloc] init];
            } else {
                insideQuote = YES;
                [tmp addObject:s];
            }
        }
    }

    return results;
}

@end

这假设您已将CSV文件读入数组:

myArray = [myData componentsSeparatedByString:@"\n"];

代码不考虑转义引号,但可以轻松扩展为。

答案 2 :(得分:8)

快速执行此操作:

NSString *dataStr = [NSString stringWithContentsOfFile:@"example.csv" encoding:NSUTF8StringEncoding error:nil];
NSArray *array = [dataStr componentsSeparatedByString: @","];

答案 3 :(得分:5)

嗯,以上简单的解决方案没有考虑多个记录。 使用以下代码读取默认的Excel Excel,使用ASCI 13作为行结束标记:

NSString *content =  [NSString stringWithContentsOfFile:filepath encoding:NSUTF8StringEncoding error:nil];
NSArray *contentArray = [content componentsSeparatedByString:@"\r"]; // CSV ends with ACSI 13 CR (if stored on a Mac Excel 2008)

for (NSString *item in contentArray) {
    NSArray *itemArray = [item componentsSeparatedByString:@";"];
    // log first item
    NSLog(@"%@",[itemArray objectAtIndex:0]);
}

答案 4 :(得分:3)

我为我正在处理的项目写了一个简单的(尽管不是功能齐全的)CSV解析器:CSVFile.hCSVFile.m。随意抓住它 - 代码可以在GPLv3下获得(不幸的是,这是我正在进行的项目的要求)但我很乐意根据MIT许可证或其他许可证向您授权。

答案 5 :(得分:1)

这似乎是迄今为止我发现的最全面的。

http://www.macresearch.org/cocoa-scientists-part-xxvi-parsing-csv-data

作为旁注,您认为大多数主要语言(Delphi,C#,Objective-c,php等)都有一个库,可以完全实现这种基本数据交换格式。

我知道json很酷且XML很可靠但是大多数应用程序都没有保存表格数据的保存选项。 CSV仍然是。

答案 6 :(得分:0)

几周前我找到了ParseKit 但对于大多数案例-[NSString componentsSeparatedByString:]方法和NSScanner,恕我直言绰绰有余且非常容易使用。

答案 7 :(得分:-2)

正如xmr上面所述:在Objective C中可以将NSString csv转换为'由string'数组分隔的组件。

    NSArray* items;
    items=[bufferString componentsSeparatedByString:@","];       

如果您对csv导出感兴趣已经到达此线程 - 正如我所做的那样 - 这里是我如何导出csv文件的摘录。

    NSString* fileName    = @"Level";
    fileName = [fileName stringByAppendingString:levelNumberBeingEdited];
    fileName = [fileName stringByAppendingString:@".txt"];
    NSString* bufferString=@"";  

通过循环遍历每个数据项(未显示)并在每个数据项之间插入逗号来填充缓冲区字符串。最后它被导出了。

    NSString* homeDir = NSHomeDirectory();
    NSString* fullPath = [homeDir stringByAppendingPathComponent:fileName];
    NSError* error = nil;
    [bufferString writeToFile:fullPath atomically:NO encoding:NSASCIIStringEncoding error:&error];