2010-08-09 8 views
6

J'écris une application iPhone, qui contient une fonction. Il peut convertir le NSMutableArray en un fichier CSV. Cependant, je ne sais pas comment faire. Quelqu'un peut-il m'aider à faire cela? Merci beaucoup.Comment convertir le fichier NSMutableArray en fichier CSV sur iPhone?

// ------ ----- Mise à jour

Merci pour tout le monde réponse.

En fait, le tableau contient les objets des éléments, mais je peux tout convent au tableau comme ceci (je suppose que c'est plus facile à faire).

Le tableau est NSMutableArray * csvArray et le tableau contient des données, comme dans l'exemple suivant.

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... 

Il y a 3 onglets du début du tableau, qui est le prénom, le nom et le téléphone. Pour les données, il contient également le "et le symbole. Par conséquent, je ne peux pas simplement couper le tableau par le « » symbole.

Le format que je voudrais la sortie est la suivante

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

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

informations ne suffisent pas à répondre. Nous aurions besoin de savoir ce qui est dans le tableau. Quel format voulez-vous utiliser pour la sortie CSV? –

+2

@Aran "dans quel format voulez-vous que la sortie CSV soit"? Vous réalisez que CSV * est * un format, non? –

+0

@Dave: Qu'en est-il si le tableau est un tableau d'objets complexes avec plusieurs champs, et pas seulement des chaînes. Par exemple: un tableau de la classe Personne avec le prénom, le nom, la date de naissance, etc .... "Est-ce que je réalise que le CSV est un format" .... oui je le fais, CSV définit les pseudo-colonnes par séparations virgules => quelles colonnes/champs .. dans le fichier. –

Répondre

17

éléments du tableau. l'analyseur CSV je l'ai écrit (http://github.com/davedelong/CHCSVParser) peut analyser les fichiers CSV dans un NSArray de NSArrays (si vous utilisez la catégorie NSArray incluse avec le code), et j'ai juste ajouté une méthode à la catégorie pour prendre un de ces tableaux et l'écrire dans un fichier CSV.

Donc, si vous avez un NSArray de NSArrays, vous pouvez l'écrire dans un fichier CSV comme celui-ci:

[myArray writeToCSVFile:myCSVFile atomically:YES]; 

Si échouera gracieusement si vous ne passez pas un NSArray de NSArrays.

modifier (invité par @ commentaire Aran à la question) tout objet à l'intérieur des sous-réseaux aura sa méthode -description écrite dans le fichier CSV. Si vous souhaitez écrire une série d'objets dans le fichier, avec diverses propriétés comme champs de la ligne CSV, mon wrapper requiert que les propriétés soient placées dans un tableau, puis ce tableau constituera la ligne.

éditer # 2 Je viens de mettre à jour mon analyseur CSV pour refactoriser l'écriture dans sa propre classe. Vous pouvez maintenant effectuer les opérations suivantes:

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

qui va écrire votre csvArray au fichier dont le chemin est outputFile, et le fichier ressemblera:

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

@Dave DeLong, merci pour votre réponse. Et j'ai mis à jour le post. Pourriez-vous regarder? Je vous remercie. – Questions

+0

@MarkSiu mis à jour la réponse –

+0

@Dave DeLong, merci pour votre réponse. C'est très utile. Mais est-il possible d'utiliser le code plutôt que de créer un objet appelé 'CHCSVWriter'? Comme je ne peux pas l'utiliser. Je vous remercie. – Questions

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

Mais attention, ce ne sera pas compte des virgules dans vous devrez définir une technique Escaping/de démasquage pour cela, et c'est entièrement à vous faire.

+0

Cela ne fonctionnera pas très bien à moins que le tableau ne soit rempli avec des chaînes (dans ce cas, il ne produit qu'un fichier CSV à une ligne). S'il contient des dictionnaires ou d'autres tableaux, la sortie ne sera pas souhaitable du tout. – dreamlax

+0

Eh bien oui, mais l'affiche originale avait la question la plus vague possible, alors j'ai donné la réponse la plus générique possible. :) –

+0

merci pour votre réponse. Comme les lignes sont séparées par le '\ r \ n', je ne peux pas utiliser simplement les componentsJoinedByString pour résoudre ce problème. – Questions

0

Une meilleure approche est l'utilisation xlsx au lieu de csv. .. C'est facile:

Vous pouvez utiliser la bibliothèque XlsxReaderWriter ... C'est gratuit et utile pour lire & écrire!

  • Créer un nouveau projet ou ouvrir un projet existant
  • Insérer XlsxReaderWriter.xcodeproj comme un sous-projet de votre projet
  • Dans vos cibles phases de compilation insérer XlsxReaderWriter comme une dépendance cible
  • Ajouter libXlsxReaderWriter.a et libz.tbd dans Link binary avec Libraries. Les anciens systèmes peuvent utiliser libz.dylib au lieu de libz.tbd.
  • Ajouter -all_load dans Liaison/Autres indicateurs de liaison dans les paramètres de votre projet
  • Ajoutez le chemin du répertoire racine XlsxReaderWriter aux chemins de recherche d'en-tête utilisateur et définissez-le comme récursif. Par exemple, définissez le chemin d'accès à "$ (SRCROOT)/XlsxReaderWriter /", pas "$ (SRCROOT)/XlsxReaderWriter/XlsxReaderWriter /".

Maintenant, vous pouvez importer BRAOfficeDocumentPackage.h dans votre code.

Il soutient également Swift:

Questions connexes