Lire un fichier texte ligne par ligne

CoreCore Membre
09:01 modifié dans API AppKit #1
Bonjour je cherche le moyen de lire un fichier TXT ligne par ligne comme en Perl

while(<FILE>)
{
print $_ ;
}

J'ai bien trouvé le moyen de faire une NSString avec tout le contenu, mais j'aimerais lire ligne par ligne

Je cherche aussi l'équivalent de SPLIT qui sépare une chaine de caractère dès que le caractère de séparation est trouvé.

Merci d'avance !!

Réponses

  • 09:01 modifié #2
    Une fois que tu as ta NSString, tu lui envoies un componentsSeparatedByString:, avec comme argument @\n pour les retours de chariot, ça renvoie un tableau de NSString. Encore mieux que ce que tu demandes ;)
  • CoreCore Membre
    09:01 modifié #3
    merci <3
  • BruBru Membre
    09:01 modifié #4
    dans 1104319656:

    Une fois que tu as ta NSString, tu lui envoies un componentsSeparatedByString:, avec comme argument @\n pour les retours de chariot, ça renvoie un tableau de NSString. Encore mieux que ce que tu demandes ;)


    Je ne suis absolument pas chaud pour utiliser cette méthode de récupération des lignes...

    \n est utilisé dans les fichiers textes issus de Unix, mais pas ceux de OS 9 (qui est \r), ni ceux de windows (\r\n).

    La classe NSString fournit une méthode getLineStart:end:contentsEnd:forRange: qui, utilisée dans une boucle, permet de récupérer toutes les lignes d'une chaà®ne, et quelque soit le séparateur de ligne utilisé.

    La doc est ici.

    .
  • CoreCore Membre
    09:01 modifié #5
    Le traitement du fichier ligne par ligne est certainement meilleur en terme de gestion de memoire

    Mais la methode componentsSeparatedByString: cité par renaud me permettra de faire mon SPLIT

    merci à  vous deux
  • CoreCore Membre
    09:01 modifié #6
    dans 1104324657:

    Je ne suis absolument pas chaud pour utiliser cette méthode de récupération des lignes...

    \n est utilisé dans les fichiers textes issus de Unix, mais pas ceux de OS 9 (qui est \r), ni ceux de windows (\r\n).

    La classe NSString fournit une méthode getLineStart:end:contentsEnd:forRange: qui, utilisée dans une boucle, permet de récupérer toutes les lignes d'une chaà®ne, et quelque soit le séparateur de ligne utilisé.

    La doc est ici.

    .


    Serait ce abuser de te demander le boucle ?
    en perl j'utilisais while (<FILE>) avec File un fichier ouvert avant la boucle

    Merci d'avance !
  • ClicCoolClicCool Membre
    09:01 modifié #7
    C'est vrai que c'est bien dommage qu'il n'y ait pas un componentsSeparatedByCharacters: qui prenne une NSCharactèreSet comme argument au lieu d'un NString.  :(
  • BruBru Membre
    décembre 2004 modifié #8
    dans 1104327389:

    Serait ce abuser de te demander le boucle ?
    en perl j'utilisais while (<FILE>) avec File un fichier ouvert avant la boucle
    Merci d'avance !


    Voici la boucle en question :
    [tt]
    {
    NSString *fichier;
    unsigned int debutLigne, debutLigneSuivante, finLigne;
    NSMutableArray *tabLigne;

    fichier=[NSString stringWithContentsOfFile:@/test.txt];
    tabLigne=[NSMutableArray array];
    debutLigneSuivante=0;

    do
    {
    [fichier getLineStart:&debutLigne
    end:&debutLigneSuivante
    contentsEnd:&finLigne
    forRange:NSMakeRange(debutLigneSuivante, 1)
            ];
    [tabLigne addObject:
    [fichier substringWithRange:NSMakeRange(debutLigne, finLigne-debutLigne)]
            ];
    } while (debutLigne<finLigne);
    }
    [/tt]

    A la fin de la procédure, le tableau (NSArray) tabLigne contient les lignes du fichier.

    .
  • CoreCore Membre
    09:01 modifié #9
    Un grand merci 
  • 09:01 modifié #10
    dans 1104324657:

    dans 1104319656:

    Une fois que tu as ta NSString, tu lui envoies un componentsSeparatedByString:, avec comme argument @\n pour les retours de chariot, ça renvoie un tableau de NSString. Encore mieux que ce que tu demandes ;)


    Je ne suis absolument pas chaud pour utiliser cette méthode de récupération des lignes...

    \n est utilisé dans les fichiers textes issus de Unix, mais pas ceux de OS 9 (qui est \r), ni ceux de windows (\r\n).


    Je me suis posé la question moi aussi la première fois que j'ai voule employer cette méthode et le fait est que pour le moment elle a toujours marché. Pour une bonne raison : je ne remplis jamais un NSString directement en lisant un fichier mais toujours en passant par un NSData et ensuite en utilisant la méthode initWithData: encoding: .

    Du coup, d'après mon expérience personnelle, la NSString signale toujours les fins de lignes par un /n.

  • tabliertablier Membre
    09:01 modifié #11
    correctif:  (j'espère que je ne dis pas de bétise!)

    dans 1104338350:

    Voici la boucle en question :

    {
        NSString *fichier;
        unsigned int debutLigne, debutLigneSuivante, finLigne;
        NSMutableArray *tabLigne;

        fichier=[NSString stringWithContentsOfFile:@/test.txt];
        tabLigne=[NSMutableArray array];
        debutLigneSuivante=0;

        do
        {
            [fichier getLineStart:&debutLigne
                end:&debutLigneSuivante
                contentsEnd:&finLigne
                forRange:NSMakeRange(debutLigneSuivante, 1)
            ];
            [tabLigne addObject:
                [fichier substringWithRange:NSMakeRange(debutLigne, finLigne-debutLigne)]
            ];
        } while (debutLigne<finLigne);
    }

    A la fin de la procédure, le tableau (NSArray) tabLigne contient les lignes du fichier.

    Chez moi, ce code plante à  tout les coups. C'est le condition du While qui me parait incorecte.

    J'ai modifié ainsi et ça marche:
    {<br />&nbsp; &nbsp; NSString *fichier;<br />&nbsp; &nbsp; unsigned int debutLigne, debutLigneSuivante, finLigne, finString;<br />&nbsp; &nbsp; NSMutableArray *tabLigne;<br /><br />&nbsp; &nbsp; fichier=[NSString stringWithContentsOfFile:@&quot;/test.txt&quot;];<br />&nbsp; &nbsp; tabLigne=[NSMutableArray array];<br />&nbsp; &nbsp; debutLigneSuivante=0;<br />&nbsp; &nbsp; finString = [fichier length];<br /><br />&nbsp; &nbsp; do<br />&nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; [fichier 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; [tabLigne addObject:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [fichier substringWithRange:NSMakeRange(debutLigne, finLigne-debutLigne)]<br />&nbsp; &nbsp; &nbsp; &nbsp; ];<br />&nbsp; &nbsp; } while (debutLigneSuivante&lt;finString);<br />}<br />
    
  • CeetixCeetix Membre
    09:01 modifié #12
    J'ai repris ce post car je veux lire dans un fichier .txt .
    J'avais à  faire comme en C avec fgets mais ça ne marche pas.

    J'ai donc fait avec ce qu'il y dans ce post :


    <br />-(IBAction)chargerTexteDeMonFichier:(id)sender {<br /><br />&nbsp;  NSString * fichier;<br />&nbsp;  fichier = [NSString stringWithContentsOfFile:@&quot;/monfichier.txt&quot;];<br />&nbsp;  NSLog(@&quot;%@&quot;,fichier);<br />
    


    Et quabd j'execute cette fonction le debbuger m'affiche (null) .
    J'ai importer monfichier.txt dans Resources .
    Qu'est-ce qui cloche?
  • schlumschlum Membre
    09:01 modifié #13
    "/monfichier.txt" c'est pas du tout le chemin vers les ressources... C'est "/monfichier.txt" quoi.
    Le même endroit où y a "/Applications"

    Regarde la méthode "- (NSString *)pathForResource:(NSString *)name ofType:(NSString *)extension" de NSBundle
  • CeetixCeetix Membre
    09:01 modifié #14
    O merci ça marche parfait. Le soucis c'est que je viens de me rendre compte que j'aimerai que le .txt soit en dehors de mon projet dans un autre dossier. Il faut donc utiliser ce que j'avais marqué avant non?
  • schlumschlum Membre
    09:01 modifié #15
    Dans ce cas, pourquoi ne pas utiliser un NSOpenPanel pour aller le chercher ?
  • CeetixCeetix Membre
    09:01 modifié #16
    C'est complexe ^^.
    en gros j'ai du code php qui va chercher dans une base du texte toutes les secondes et qui met se texte dans monfichier.txt . Je veux afficher ce contenu dans mon application et qu'il soit actualisé tout seul. Sans devoir aller le chercher.
  • schlumschlum Membre
    09:01 modifié #17
    C'est user-dépendant ou pas ?
    Quoi qu'il en soit, ça a dans ce cas sa place dans un des dossiers "Application Support"
  • CeetixCeetix Membre
    09:01 modifié #18
    Pour le moment oui c'est pour un projet ce serai bien que l'user n'ai pas à  créer le fichier et à  le placer dans le bon dossier :)  .
    Pa contre je vois pas de Application support ... Il faudrai copier monfichier.txt dans ce dossier et reprendre mon ancien code?
  • schlumschlum Membre
    09:01 modifié #19
    /Library/Application\ Support/<nom appli> pour le global
    /Users/<username>/Library/Application\ Support/<nom appli> pour le endUser
  • CeetixCeetix Membre
    09:01 modifié #20
    Yes ca marche super. Merci beaucoup !
  • CeetixCeetix Membre
    09:01 modifié #21
    Juste un dernier truc, si j'ai envie de lire un .txt mais pas dans Application Support ... ? C'est possible j'imagine.
  • schlumschlum Membre
    09:01 modifié #22
    Ben... Oui, suffit de donner le chemin  :)
  • CeetixCeetix Membre
    09:01 modifié #23
    Je sors  :crackboom:- .
    Merci.
Connectez-vous ou Inscrivez-vous pour répondre.