2010-08-09 21 views
6

Estoy escribiendo una aplicación para iPhone, que contiene una función. Puede convertir NSMutableArray a un archivo CSV. Sin embargo, no sé cómo hacerlo. ¿Alguien puede ayudarme a hacer esto? Muchas gracias.¿Cómo convertir el archivo NSMutableArray a CSV en iPhone?

// ------ ----- actualización

Gracias por la respuesta a todos.

En realidad, la matriz contiene los objetos de los elementos, pero puedo convencerlo todo a la matriz como el siguiente (supongo que es más fácil hacer esto).

La matriz es NSMutableArray * csvArray y la matriz contiene datos, como en el siguiente ejemplo.

csvArray[0] = First Name 
csvArray[1] = Last Name 
csvArray[2] = Phone 
csvArray[3] = Tom 
csvArray[4] = Chan 
csvArray[5] = 123 
csvArray[6] = Peter 
csvArray[7] = Wong 
csvArray[8] = 456 
csvArray[9] = Mary's 
csvArray[10] = Cho"w 
csvArray[11] = 789... 

Hay 3 pestañas en el comienzo de la matriz, que es el nombre, el apellido y el teléfono. Para los datos, sino que también contiene la "y, símbolo. Por lo tanto, no puedo acaba de cortar la matriz por el símbolo ''.

El formato me gustaría salida es la siguiente

//--------------------------- 

First Name, Last Name, Phone // <- it have the \r\n between each row of data 
Tom, Chan, 123 
Peter, Wong, 456 
Mary's, Cho"w, 789 ... 

//--------------------------- 
+1

no hay suficiente información para responder. Necesitaríamos saber qué hay en la matriz. ¿En qué formato quieres que esté el archivo CSV de salida. –

+2

@Aran "en qué formato quieres que esté el archivo CSV de salida"? Se da cuenta de que CSV * es * un formato, ¿verdad? –

+0

@Dave: qué pasa si la matriz es una matriz de objetos complejos con múltiples campos, y no solo cadenas. Por ejemplo: una matriz de clase Persona con Nombre de pila, Apellido, Fecha de nacimiento, etc. "¿Me doy cuenta de que CSV es un formato" ... sí, CSV define pseudo columnas mediante separaciones de coma, entonces, qué formato => qué columnas/campos ... en el archivo. –

Respuesta

17

el analizador CSV escribí (http://github.com/davedelong/CHCSVParser) puede analizar archivos CSV en un NSArray de NSArrays (si usa la categoría NSArray incluida con el código), y acabo de agregar un método a la categoría para tomar una de esas matrices y volver a escribirla en un archivo CSV.

Así que si usted tiene una NSArray de NSArrays, a continuación, puede escribirlo en un archivo CSV como esto:

[myArray writeToCSVFile:myCSVFile atomically:YES]; 

Si gracia fallará si no pasa un NSArray de NSArrays.

edición (impulsada por el comentario de @ Aran a la pregunta) cualquier objeto dentro de las submatrices tendrá su método -description escribe en el archivo CSV. Si desea escribir una serie de objetos en el archivo, con varias propiedades como los campos de la fila CSV, entonces mi envoltorio requiere que las propiedades se coloquen en una matriz, y esa matriz conformará la fila.

edit # 2 Acabo de actualizar mi analizador CSV para refactorizar la escritura en su propia clase. Ahora puede hacer lo siguiente:

CHCSVWriter * csvWriter = [[CHCSVWriter alloc] initWithCSVFile:outputFile atomic:NO]; 
NSInteger numberOfColumns = 3; 
for (NSInteger currentIndex = 0; currentIndex < [csvArray count]; currentIndex++) { 
    id field = [csvArray objectAtIndex:currentIndex]; 
    [csvWriter writeField:field]; 
    if ((currentIndex % numberOfColumns) == (numberOfColumns - 1)) { 
    [csvWriter writeLine]; 
    } 
} 
[csvWriter release]; 

que escribirá su csvArray al archivo cuya ruta es outputFile, y el archivo se verá así:

First Name,Last Name,Phone 
Tom,Chan,123 
Peter,Wong,456 
Mary's,"Cho""w",789 
+0

@Dave DeLong, gracias por su respuesta. Y he actualizado la publicación. ¿Te importaría echarle un vistazo? gracias. – Questions

+0

@MarkSiu respuesta actualizada –

+0

@Dave DeLong, gracias por su respuesta. Es muy útil. Pero, ¿es posible usar el código en lugar de crear un objeto llamado 'CHCSVWriter'? Como no puedo usar eso. Gracias. – Questions

17
NSString *csv = [myArray componentsJoinedByString: @","]; 

Pero cuidado, esto no va a dar cuenta de las comas dentro de los elementos de la matriz. usted tendrá que definir alguna técnica de escape/unescape para eso, y eso es totalmente de usted para hacerlo.

+0

Esto no funcionará terriblemente bien a menos que la matriz esté llena de cadenas (en cuyo caso solo produce un archivo CSV de una sola fila). Si contiene diccionarios u otras matrices, entonces la salida no será deseable en absoluto. – dreamlax

+0

Bueno, sí, pero el póster original tenía la pregunta más vaga posible, así que di la respuesta más genérica posible. :) –

+0

gracias por su respuesta. Como las filas están separadas por '\ r \ n', no puedo usar simplemente los componentesJoinedByString para resolver este problema. – Questions

0

mejor enfoque es el uso xlsx en lugar de csv. .. Es fácil:

Puede usar la biblioteca XlsxReaderWriter ... ¡Es gratis y útil para leer & escribir!

  • Crear un nuevo proyecto o abrir un proyecto existente
  • Insertar XlsxReaderWriter.xcodeproj como un proyecto secundario de su proyecto
  • En sus fases objetivo build insertar XlsxReaderWriter como una dependencia de destino
  • Añadir libXlsxReaderWriter.a y libz.tbd en enlace binario con bibliotecas. Los sistemas antiguos pueden usar libz.dylib en lugar de libz.tbd.
  • Add-all_load in Linking/Other Linker Flags en la configuración de su proyecto
  • Agregue la ruta del directorio raíz XlsxReaderWriter a las rutas de búsqueda del encabezado del usuario y configúrelo como recursivo. Por ejemplo, establezca la ruta a "$ (SRCROOT)/XlsxReaderWriter /", no "$ (SRCROOT)/XlsxReaderWriter/XlsxReaderWriter /".

Ahora, puede importar BRAOfficeDocumentPackage.h en su código.

También es compatible con Swift: