Я ищу простой в использовании синтаксический анализатор CSV для Objective-C для использования на iPhone. Где я могу найти его?
Я также ищу другие синтаксические анализаторы, такие как JSON, поэтому, возможно, где-то есть библиотека преобразования.
Я ищу простой в использовании синтаксический анализатор CSV для Objective-C для использования на iPhone. Где я могу найти его?
Я также ищу другие синтаксические анализаторы, такие как JSON, поэтому, возможно, где-то есть библиотека преобразования.
Наконец-то я собрался, чтобы очистить парсер, который у меня был в моей кодовой папке, и разместил его на Github: http://github.com/davedelong/CHCSVParser
Это довольно основательно. Он обрабатывает всевозможные схемы экранирования, новые строки в полях, комментарии и т.д. Он также использует интеллектуальную загрузку файлов, что означает, что вы можете безопасно разбирать огромные файлы в условиях ограниченной памяти.
Здесь простая категория в 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: @","];
Хорошо, что над простыми решениями не учитываются несколько записей. Используйте следующий код, считывающий CSV по умолчанию, используя 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]);
}
Я написал мертвый простой (хотя и не полностью признанный) CSV-парсер для проекта, над которым я работал: CSVFile.h
и CSVFile.m
. Не стесняйтесь его захватить - код доступен под GPLv3 (к сожалению, это было требование для проекта, над которым я работал), но я был бы рад лицензировать его вам по лицензии MIT или другой лицензии.
Это кажется наиболее полным, что я нашел до сих пор.
http://www.macresearch.org/cocoa-scientists-part-xxvi-parsing-csv-data
В качестве примечания вы могли бы подумать, что большинство основных языков (Delphi, С#, Objective-c, php и т.д.) будут иметь доступную библиотеку с полной реализацией этого базового формата обмена данными.
Я знаю, что json классный, а XML надежный, но ни один из них не доступен в качестве опции сохранения из большинства приложений, сохраняющих данные таблицы. CSV все еще есть.
Я нашел ParseKit несколько недель назад
Но IMHO для большинства случаев -[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* [email protected]"";
Буферная строка заполняется путем циклического прохождения каждого элемента данных (не показана) и вставки запятой между ними. Наконец, он экспортируется.
NSString* homeDir = NSHomeDirectory();
NSString* fullPath = [homeDir stringByAppendingPathComponent:fileName];
NSError* error = nil;
[bufferString writeToFile:fullPath atomically:NO encoding:NSASCIIStringEncoding error:&error];