¿Dónde puedo encontrar un analizador de CSV a NSArray para Objective-C?

Estoy buscando un analizador CSV fácil de usar para Objective-C para usar en el iPhone. ¿Dónde puedo encontrar uno?

También estoy buscando otros analizadores sintácticos como JSON, así que tal vez haya una biblioteca de conversión en alguna parte.

Finalmente logré limpiar un analizador que tenía en mi carpeta de códigos y lo publiqué en Github: http://github.com/davedelong/CHCSVParser

Es bastante completo. Maneja todo tipo de esquemas de escape, líneas nuevas en campos, comentarios, etc. También utiliza la carga inteligente de archivos, lo que significa que puede analizar archivos enormes en condiciones de memoria limitada.

Aquí hay una categoría simple en NSString para analizar una cadena de CSV que tiene comas incrustadas dentro de los bloques de comillas.

 #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 

Esto supone que ya ha leído su archivo CSV en una matriz:

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

El código no tiene en cuenta las comillas escapadas, pero podría ampliarse fácilmente a.

Forma rápida de hacer esto:

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

Bueno, las soluciones anteriores simplemente no tienen en cuenta múltiples registros. Use el siguiente código para leer un CSV de Excel predeterminado usando ASCI 13 como marcador de fin de línea:

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

Escribí un analizador CSV absolutamente simple (aunque no con todas las funciones) para un proyecto en el que estaba trabajando: CSVFile.h y CSVFile.m . Siéntase libre de tomarlo: el código está disponible bajo la GPLv3 (desafortunadamente, era un requisito para el proyecto en el que estaba trabajando) pero estaría encantado de otorgarle la licencia bajo una licencia de MIT u otra licencia.

Este parece ser el más completo que he encontrado hasta ahora.

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

Como nota al margen, pensarías que la mayoría de los principales idiomas (Delphi, C #, Objective-c, php, etc.) tendrían una biblioteca disponible con una implementación completa de este formato básico de intercambio de datos.

Sé que json es genial y XML es confiable, pero ninguno está disponible como una opción de guardado en la mayoría de las aplicaciones que guardan datos de la tabla. CSV todavía lo es.

Encontré ParseKit hace unas semanas Pero en mi humilde opinión para la mayoría de los casos -[NSString componentsSeparatedByString:] y NSScanner son más que suficientes y bastante fáciles de usar.

Como dijo xmr arriba: es posible en Objective C convertir un NSString csv en una matriz ‘components separated by string’.

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

En caso de que esté interesado en que la exportación de csv haya llegado a este hilo, como lo hice, aquí hay un extracto de cómo exporté un archivo csv.

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

Buffer String se completa al recorrer cada elemento de datos (no se muestra) e insertar una coma entre cada uno. Finalmente se exporta.

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