Importer des données en CSV (résolu)

orfaitorfait Membre
janvier 2008 modifié dans API AppKit #1
Bonjour,

Je vous passe les formalités... en gros, je cherche à  récupérer des données d'un fchier .csv séparé avec des ";" et ce que j'ai codé plante si je met "\r" dans le premier séparateur (cf en dessous).
Si je mets "\n", toutes les données sont sur une seule ligne... Donc mon
    vaut 1 et mon tableau est incomplet.Alors soit je n'ai rien compris (sisi, c'est possible), soit je suis à  côté de la plaque ou soit il y a un petit bug qui traine...Voilà  le seul et unique code que j'ai (j'espère qu'il n'est pas trop sale) :controller.m
#import &quot;controller.h&quot;<br /><br />@implementation controller<br /><br />- (IBAction)a_sauver:(id)sender {<br />    <br />}<br />- (void)awakeFromNib {<br />NSString *path = [[NSBundle mainBundle] pathForResource:@&quot;LOG&quot; ofType:@&quot;csv&quot;];<br />NSString *fileContents = [NSString stringWithContentsOfFile:path];<br />NSArray *list = [fileContents componentsSeparatedByString:@&quot;&#092;r&quot;];<br />TableContacts = [[NSMutableArray alloc]initWithCapacity:[list count]];<br /><br />    int i;<br />    <br />    for (i=0; i&lt;[list count]; i++)<br />    {<br />      NSString *line = [list objectAtIndex:i];<br />      NSMutableArray *csv = [[NSMutableArray alloc] initWithArray:[line componentsSeparatedByString:@&quot;;&quot;]];<br /><br />      [TableContacts addObject:csv];<br />      [csv release];<br />    }<br />}<br /><br />- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {<br />[o_tableau reloadData];<br />}<br /><br />- (int)numberOfRowsInTableView:(NSTableView *)aTableView<br />{<br />return [TableContacts count];<br />}<br /><br />- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex<br />{<br />return [[TableContacts objectAtIndex:0] objectAtIndex:(rowIndex+3)]; // CODE SANS SIGNIFICATION SUR LES DONNEES (POUR TEST)<br />}<br /><br /><br />@end<br />

controller.h
#import &lt;Cocoa/Cocoa.h&gt;<br /><br />@interface controller : NSObject {<br />	NSMutableArray *TableContacts;<br />    IBOutlet id o_tableau;<br />	IBOutlet id o_array; // NON UTILISE<br />}<br />- (void)applicationDidFinishLaunching:(NSNotification *)aNotification;<br />- (IBAction)a_sauver:(id)sender;<br />- (int)numberOfRowsInTableView:(NSTableView *)aTableView;<br />- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex;<br />@end


Si un bout de code n'est pas clair, je l'expliquerai volontiers... c'est difficile de retracer tout ce que j'ai fait depuis le début.


Merci

Réponses

  • BruBru Membre
    17:07 modifié #2
    Le problème du fichier csv avec \r ou \n pour séparer les lignes, c'est que cela dépend d'où provient le fichier.
    Sous Mac, alors c'est \r. Sous Unix, c'est \n, et sous Windows, c'est \r\n.
    Bref, ton premier componentsSeparatedByString:@\r n'est pas idéal.

    Pour être sûr de récupérer les vrais lignes de ton csv (avant de les décomposer avec le point-virgule), c'est d'utiliser getLineStart:end:contentsEnd:forRange: de NSString (fais une recherche sur OC, ça déjà  été expliqué).

    Une fois la ligne récupérée et non vide, il ne te reste plus qu'à  décomposer avec le second componentsSeparatedByString:@;.

    .
  • orfaitorfait Membre
    17:07 modifié #3
    Impeccable !
    J'ai suivi ton exemple dans cet autre topic et ça roule !

    Pour les curieux ou bien ceux qui auraient les mêmes besoins, j'ai fait une fonction d'importation toute simple.

    Fonction d'importation :
    - (void)ImportCSV:(NSString *)path {<br />unsigned int debutLigne, debutLigneSuivante, finLigne, finString;<br />NSString *fileContents;<br />NSMutableArray *list;<br />fileContents = [NSString stringWithContentsOfFile:path];<br />debutLigneSuivante = 0;<br />list = [NSMutableArray array];<br />finString = [fileContents length];<br /><br />&nbsp; &nbsp; do<br />&nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; [fileContents getLineStart:&amp;debutLigne<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end:&amp;debutLigneSuivante<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; contentsEnd:&amp;finLigne<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; forRange:NSMakeRange(debutLigneSuivante, 1)<br />&nbsp; &nbsp; &nbsp; &nbsp; ];<br />&nbsp; &nbsp; &nbsp; &nbsp; [list addObject:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [fileContents substringWithRange:NSMakeRange(debutLigne, finLigne-debutLigne)]<br />&nbsp; &nbsp; &nbsp; &nbsp; ];<br />&nbsp; &nbsp; } while (debutLigneSuivante &lt; finString);<br /><br />TableContacts = [[NSMutableArray alloc]initWithCapacity:[list count]];<br /><br />&nbsp; &nbsp; int i;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; for (i=0; i&lt;[list count]; i++)<br />&nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; NSString *line = [list objectAtIndex:i];<br />&nbsp; &nbsp; &nbsp; NSMutableArray *csv = [[NSMutableArray alloc] initWithArray:[line componentsSeparatedByString:@&quot;;&quot;]];<br /><br />&nbsp; &nbsp; &nbsp; [TableContacts addObject:csv];<br />&nbsp; &nbsp; &nbsp; [csv release];<br />&nbsp; &nbsp; }<br />[TableContacts removeObjectAtIndex:0];<br />}
    

    Appel :
    [self ImportCSV:[[NSBundle mainBundle] pathForResource:@&quot;LOG&quot; ofType:@&quot;csv&quot;]];
    


    Si c'est trop salement codé, je suis ouvert aux propositions d'améliorations...
Connectez-vous ou Inscrivez-vous pour répondre.