2010-07-27 10 views

Respuesta

50

finalmente llegué a la limpieza de un programa de análisis que he tenido en mi carpeta de código y lo publicó 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.

+0

He revisado el enlace de Github que me has dado, por lo que se ve bien, pero cuando probé a probarlo en el simulador de iPhone, parece que no funciona. Simulator no se abre Además, el SDK base se ha configurado en Mac OS X 10.5. Entonces, ¿esto no funcionará para iPhone? ¿Lo que debe hacerse? Gracias. :) –

+1

@PARTH hay una lista de archivos en la sección de uso general del archivo léame. Copie esos en su proyecto y '#importar" CHCSV.h "' –

+0

Gracias Dave por responder a mi tonta pregunta :) También entonces supongo que tenemos que usar simplemente el método arrayWithContentsofCSVFile :. ¿derecho? –

8

manera rápida de hacer esto:

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

+1

Esto no maneja los bloques que contienen, aunque es por eso que a menudo necesita una biblioteca completa :) – willcodejavaforfood

+0

no es lo que necesito hoy, pero es bueno saber acerca de ese método/mensaje (?) –

0

que he encontrado hace unas semanas ParseKit Pero en mi humilde opinión de la mayoría de los casos -[NSString componentsSeparatedByString:] método y NSScanner son más que suficiente y muy fácil de usar.

+0

gracias, parece un poco complejo por lo que estoy buscando sin embargo. –

3

Escribí un analizador CSV dead-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.

1

Esto 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, se podría pensar 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.

-2

Como xmr dijo anteriormente: Es posible en Objective C convertir un NSString csv en una matriz 'components separated by string'.

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

En caso de estar interesado en la exportación CSV Llegados a este hilo - como lo hice - aquí es un extracto de cómo he exportado un archivo csv.

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

La cadena de relleno se completa mediante un bucle a través de cada elemento de datos (no se muestra) e insertando 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]; 
+7

-1 sea lo que sea, no es una respuesta sobre cómo analizar archivos CSV. Marcado –

+1

He editado mi respuesta. Fui guiado a este hilo y xmr resolvió mi problema. Pensé que sería útil mostrar cómo encaja el archivo de texto csv real en su solución. –

5

Bueno, las soluciones anteriores simplemente no tienen en cuenta registros múltiples. utilizar el siguiente código lee un CSV de Excel por defecto utilizando ASCI 13 como marcador de final 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]); 
} 
+0

debe tener en cuenta que aunque esto podría funcionar para archivos simples, no funcionará en muchos escenarios. Hay casos en los que puede escapar de las comas, o cuando coloca un valor dentro de las comillas. componentsSeparatedByString no detectará ninguno de estos. También hay situaciones en las que un valor de celda puede contener una nueva línea, por lo que en estos escenarios, su matriz de contenido tampoco sería precisa. Esta es la razón por la que otras personas recomiendan utilizar bibliotecas, como CHCSV Parser. Estos están diseñados para manejar todos estos escenarios. – Rob

17

Aquí está una categoría simple en NSString a analizar una cadena CSV que tiene comas incrustadas dentro de los bloques de cotización.

#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 usted ha leído el archivo CSV en una matriz ya:

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

El código no tiene en cuenta las cotizaciones escapado, pero podría extenderse fácilmente a.

Cuestiones relacionadas