2010-12-14 113 views
3

Je suis relativement nouveau dans la programmation objective-c et orientée-objet en général et j'ai une question théorique de type stylistique. Ce que je veux faire est de charger une table de classes avec des entrées d'un fichier délimité par des virgules. Les données du fichier sont constituées de nombreuses entrées composées d'une clé courte suivie de plusieurs valeurs de chaîne, toutes délimitées par des virgules.Meilleure façon d'aborder le chargement d'une classe à partir d'un fichier délimité par des virgules

Il y a un million de façons de le faire mais je demande quel serait le meilleur moyen d'un point de vue strictement théorique. Je voudrais rester à l'écart de tout type de codage XML pour le moment mais je finirai probablement par me convertir à ce format une fois que j'aurai un programme d'entrée ensemble.

Je pourrais utiliser une fonction pour obtenir le 'prochain enregistrement' et passer une structure dans et hors de la fonction, créer une nouvelle instance de la classe, la charger depuis la structure, puis l'ajouter dans un tableau. J'utiliserais la méthode stringWithContentsOfFile pour charger le fichier dans une chaîne puis j'utiliserais des fonctions de chaîne et quelques pointeurs pour parcourir le fichier pour retourner les éléments de structure que je chargerais ensuite dans la classe. Est-ce que cela semble être un moyen raisonnable de faire cela dans l'objectif-c ou existe-t-il une meilleure méthode qui est peut-être plus théoriquement solide et qui fonctionnerait au moins aussi bien?

Répondre

4

Vous avez un fichier CSV, et vous voulez le lire? There's some code for that.

La plus simple approche serait quelque chose comme:

#import "CHCSV.h" 

NSString * csvFile = ...; //path to the CSV file 
NSError * error = nil; 
NSArray * contents = [NSArray arrayWithContentsOfCSVFile:csvFile 
               encoding:NSUTF8StringEncoding 
                error:&error]; 
if (contents == nil) { 
    NSLog (@"Error %@", error); 
} else { 
    for (NSArray * row in contents) { 
     NSLog(@"CSV fields in this line: %@", row); 
     // "row" contains all the fields (as NSStrings) that were present 
     // on this line of CSV 
    } 
} 
+0

C'est un beau morceau de code. Un peu compact pour un vieux COBOLer mais plutôt sympa. J'avais envisagé de construire une 'classe' autour du fichier d'entrée et d'utiliser des 'méthodes' pour extraire ce dont j'avais besoin. Une méthode pour le charger dans un NSSTRING ... une méthode différente pour extraire la ligne suivante dans une chaîne d'anthères ... une autre méthode pour obtenir la première valeur dans la ligne courante ... etc ... Est-ce à peu près exagéré? –

+0

@Joe cela dépend de ce que votre objectif est avec le code. Lors de l'écriture de 'CHCSVParser', mon but était de rendre l'utilisation aussi simple que possible, donc en plus de l'option d'analyse par événement (voir le projet pour savoir comment cela fonctionne), j'ai aussi ajouté ce truc pour en faire un appel d'une ligne. –

+0

Merci pour cela. Je vais probablement essayer dans les deux sens (l'un en utilisant le code que vous avez fourni) et une autre version peut-être plus formelle juste pour voir les avantages/inconvénients. –