【问题标题】:Where can I find a CSV to NSArray parser for Objective-C? [closed]我在哪里可以找到用于 Objective-C 的 CSV 到 NSArray 解析器? [关闭]
【发布时间】:2010-07-27 14:26:18
【问题描述】:

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

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

【问题讨论】:

    标签: iphone objective-c ios parsing


    【解决方案1】:

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

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

    【讨论】:

    • 我已经检查了您提供的 Github 链接,它看起来不错,但是当我尝试在 iPhone 模拟器中对其进行测试时,它似乎不起作用。模拟器打不开。此外,基本 SDK 已设置为 Mac OS X 10.5。那么这不适用于iPhone吗?应该做什么?谢谢。 :)
    • @PARTH 自述文件的一般使用部分中有一个文件列表。将它们复制到您的项目中并#import "CHCSV.h"
    • 感谢 Dave 回答我的愚蠢问题 :) 另外我想我们只需要使用 arrayWithContentsofCSVFile: 方法。对吗?
    • @PARTH 这绝对是最简单的方法之一!如果你愿意,你也可以使用整个 parser-with-a-delegate 路由。
    • 好的,谢谢戴夫。 :) 圣诞节快乐!!! :)
    【解决方案2】:

    这是 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"];
    

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

    【讨论】:

      【解决方案3】:

      快速的方法:

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

      【讨论】:

      • 这不会处理包含 , 的块,但这就是为什么你经常需要一个完全成熟的库:)
      • 不是我今天需要的,但很高兴了解该方法/消息(?)
      【解决方案4】:

      嗯,以上简单的解决方案没有考虑多条记录。 使用以下代码读取使用 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]);
      }
      

      【讨论】:

      • 您必须考虑到,虽然这可能适用于简单文件,但在许多情况下它并不适用。在某些情况下,您可以转义逗号,或者将值放在引号内。 componentsSeparatedByString 不会捕获任何这些。在某些情况下,单元格值可以包含换行符,因此在这些情况下,您的内容数组也不会准确。这就是为什么其他人建议使用库,例如​​ CHCSV Parser。这些都是为处理所有这些情况而构建的。
      【解决方案5】:

      我为我正在处理的一个项目编写了一个非常简单(尽管功能不全)的 CSV 解析器:CSVFile.hCSVFile.m。随意获取它——代码在 GPLv3 下可用(不幸的是,这是我正在从事的项目的要求),但我很乐意根据 MIT 许可证或其他许可证将其许可给您。

      【讨论】:

        【解决方案6】:

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

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

        附带说明一下,您会认为大多数主要语言(Delphi、C#、Objective-c、php 等)都有一个库,可以完整实现这种基本数据交换格式。

        我知道 json 很酷,XML 也很可靠,但大多数应用程序保存表数据时都不能作为保存选项。 CSV 仍然是。

        【讨论】:

          【解决方案7】:

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

          【讨论】:

          • 谢谢,不过我要找的东西看起来有点复杂。
          【解决方案8】:

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

          【讨论】:

          • -1 不管是什么,它都不是关于如何解析 CSV 文件的答案。已标记。
          • 我已经编辑了我的答案。我被引导到这个线程,xmr 解决了我的问题。我认为展示实际的 csv 文本文件如何适合他的解决方案会很有用。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-13
          • 1970-01-01
          • 2011-03-26
          相关资源
          最近更新 更多