代码之家  ›  专栏  ›  技术社区  ›  Toby Allen mercator

在哪里可以找到Objective-C的CSV-to-NSArray解析器[[关闭]

  •  37
  • Toby Allen mercator  · 技术社区  · 14 年前

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

    我也在寻找其他解析器,比如JSON,所以可能有一个转换库。

    8 回复  |  直到 13 年前
        1
  •  51
  •   Dave DeLong    14 年前

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

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

        2
  •  18
  •   gose    12 年前

    #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"];
    

    该代码不考虑转义引号,但可以很容易地扩展到。

        3
  •  8
  •   xmr    14 年前

    快速方法:

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

        4
  •  5
  •   JeanNicolas    12 年前

    好吧,上面的简单解决方案不考虑多个记录。 使用以下代码读取使用ASCI 13作为行尾标记的默认excel CSV:

    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]);
    }
    
        5
  •  3
  •   mipadi    14 年前

    CSVFile.h CSVFile.m . 请随意获取它——代码可以在GPLv3下获得(不幸的是,这是我正在工作的项目的一个要求),但是我很乐意在MIT许可证或其他许可证下授权给您。

        6
  •  1
  •   Toby Allen mercator    14 年前

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

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

    顺便说一句,您可能认为大多数主要语言(Delphi、C#、Objective-C、php等)都会有一个库,可以完全实现这种基本的数据交换格式。

    我知道json很酷,XML也很可靠,但在大多数保存表数据的应用程序中,这两种方法都不能作为保存选项。CSV仍然是。

        7
  •  0
  •   OgreSwamp    14 年前

    我找到了 ParseKit 但在大多数情况下 -[NSString componentsSeparatedByString:] 方法和 NSScanner 已经足够了,而且很容易使用。

        8
  •  -2
  •   Barnaby Byrne    13 年前

    正如上面xmr所说:在Objective C中,可以将NSString csv转换成“由字符串分隔的组件”数组。

        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];