【发布时间】:2010-07-27 14:26:18
【问题描述】:
我正在寻找一个易于使用的用于 Objective-C 的 CSV 解析器,以便在 iPhone 上使用。在哪里可以找到?
我也在寻找其他的解析器,比如 JSON,所以也许某处有一个转换库。
【问题讨论】:
标签: iphone objective-c ios parsing
我正在寻找一个易于使用的用于 Objective-C 的 CSV 解析器,以便在 iPhone 上使用。在哪里可以找到?
我也在寻找其他的解析器,比如 JSON,所以也许某处有一个转换库。
【问题讨论】:
标签: iphone objective-c ios parsing
我终于开始清理代码文件夹中的解析器并将其发布在 Github 上:http://github.com/davedelong/CHCSVParser
这很彻底。它处理各种转义方案、字段中的换行符、cmets 等。它还使用智能文件加载,这意味着您可以在内存受限的情况下安全地解析大文件。
【讨论】:
#import "CHCSV.h"
这是 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"];
代码不考虑转义引号,但可以很容易地扩展到。
【讨论】:
快速的方法:
NSString *dataStr = [NSString stringWithContentsOfFile:@"example.csv" encoding:NSUTF8StringEncoding error:nil];
NSArray *array = [dataStr componentsSeparatedByString: @","];
【讨论】:
嗯,以上简单的解决方案没有考虑多条记录。 使用以下代码读取使用 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]);
}
【讨论】:
这似乎是迄今为止我发现的最全面的。
http://www.macresearch.org/cocoa-scientists-part-xxvi-parsing-csv-data
附带说明一下,您会认为大多数主要语言(Delphi、C#、Objective-c、php 等)都有一个库,可以完整实现这种基本数据交换格式。
我知道 json 很酷,XML 也很可靠,但大多数应用程序保存表数据时都不能作为保存选项。 CSV 仍然是。
【讨论】:
几周前我找到了ParseKit
但恕我直言,在大多数情况下,-[NSString componentsSeparatedByString:] 方法和 NSScanner 绰绰有余,而且非常易于使用。
【讨论】:
正如 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];
【讨论】: