IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Lire fichier Texte


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 87
    Par défaut Lire fichier Texte
    Bonjour à tous!
    J'ai un petit soucis... je voudrais écrire une fonction qui me lit un fichier texte (je passe l'adresse du fichier texte en paramètre de la fonction) et ensuite cette fonction devra découper mon texte en phrase. Je m'explique: je voudrais que cette fonction lise mon fichier texte et à chaque fois qu'elle trouve un "." qu'elle m'écrive la phrsae qu'elle vient de trouver dans un autre fichier. Le fichier ainsi obtenu serait en quelque sorte le même fichier texte que celui de départ sauf qu'il y aurait un saut de ligne à chaque fin de phrase.
    J'ai déjà effectué des recherches sur le forum mais je n'ai rien trouvé qui puisse m'intéresser...

    Merci d'avance et bon après-midi à tous.

  2. #2
    Membre confirmé Avatar de dedeloux
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 104
    Par défaut
    Salut,

    je pense que tu peux utiliser la fonction subString(int pos1, int pos2).
    Cette fonction te permet de récupérer la chaine de caractère entre la position1 (pos1) et la position2 (pos2).

    Il ne te reste qu'a trouver l'index de tous tes points. Il y a une fonction indexOf ui renvoit l'index d'un caractère mais seulement la première occurence (c'est à dire le premier rencontré) donc ça ne marche pas à moins que tu effaces tes phrases au fur et à mesure mais je ne pense pas.
    Tu peux peut etre parcourir ton fichier une fois et noter la position de tes points dans un tableau. Ensuite tu n'auras plus qu'à faire des substring entre les positions de tes points.

    Voilà, je ne sais pas si mon idée est très performante mais bon...
    Bon courage

    Bon courage.

  3. #3
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 87
    Par défaut
    Je garde ta solution bien au chaud et je vous fais part d'une idée que j'avais: je pourrais peut être parcourir mon fichier texte en le lisant caractère par caractère et à chauqe fois que je trouve un caractère qui n'est pas un "." je l'ajoute à une chaîne que j'aurai au préalable créée, ensuite dès que je rencontre un ".", j'arrête de stocker ma chaîne et je l'écris dans une fichier à part; puis je continue mon parcours de fichier en réinitialisant ma chaîne de départ... etc... qu'en pensez-vous?
    De plus, pour pouvoir lire mon fichier caractère par caractère que faut-il que j'utilise?

    Merci d'avance

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Tu peus charger ton fichier texte dans un String puis il ne te reste plus qu'à faire un split("\\."), ce qui te donnera un tableau de String de toutes les phrases.
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  5. #5
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    L'idée de le lire caractères par caractères est pas mal du tout, mais ce que tu peut aussi faire, c'est le lire entiérement (ligne par ligne je pense), le stocker dans une seule chaine de caractères (Employer StringBuffer pour les perfs) et ensuite tu peut pencher sur le stringTokenizer qui te permettra de séparer ta chaine à chaque séparateur(dans ton cas le .) et ensuite d'écrire le tout dans un nouveau fichier séparé cette fois par des retours à la ligne.

    Pour lire le fichier ligne par ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
          BufferedReader ToLoad;
          String ligne;
           try {
              ToLoad  = new BufferedReader(new FileReader(new File(tonCheminDeFichierALire)));
    			} catch (FileNotFoundException e) {e.printStackTrace();}
     
    			try {
    				while ((ligne = ToLoad.readLine())!=null){ 
    					//Action que tu effectues à chaque ligne
    				}
    			} catch (IOException e) {e.printStackTrace();}
     
    			try {
    				ToLoad.close();
    			} catch (IOException e) {e.printStackTrace();}

  6. #6
    Membre confirmé Avatar de dedeloux
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 104
    Par défaut
    Je pense que lire caratère par caractère n'est pas une bonne idée mais tu peux toujours le faire si ton fichier n'est pas trop gros.

    Pour lire caractère par caractère, il te suffit de parcourir ta chaine avec une boucle for ou while.

  7. #7
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 87
    Par défaut
    Citation Envoyé par le y@m's
    Tu peus charger ton fichier texte dans un String puis il ne te reste plus qu'à faire un split("\\."), ce qui te donnera un tableau de String de toutes les phrases.
    Ta solution m'interesse mais je ne vois pas excatement comment l'utiliser...
    Faut que je fasse ça?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String[] monTableauDeChaines = maChaine.split("\\.");

  8. #8
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Philippines

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2005
    Messages : 244
    Par défaut
    Citation Envoyé par dedeloux
    Je pense que lire caratère par caractère n'est pas une bonne idée mais tu peux toujours le faire si ton fichier n'est pas trop gros.

    Pour lire caractère par caractère, il te suffit de parcourir ta chaine avec une boucle for ou while.
    L'interet de lire byte a byte est justement lorsqu'on ne peut pas charger le contenu du fichier en memoire, lorsqu'il est trop gros.

    Non, personnelement, j'utiliserai un bufferedInputStream (celui ci charge une partie du fichier en memoire pour accelerer la lecture), et je lirai caractere par caracteres, modifiant tout les '.' en '\r\n' vers un OutputStream

    Enfin si c'est des fichiers leger (<1Mo), tu peu aussi lire tout dans un tableau de Bytes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    File f = new File(filename);
    byte[] b = new byte[f.length];
    FileInputStream fis;
    try{
     fis = new FileInputStream(f);
     fis.read(b);
     String s = new String(b);
     String[] phrases = s.split("\\.");
     } catch (IOException e)
    {
      e.printStackTrace();
    } finally
    {
     fis.close();
    }

  9. #9
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Citation Envoyé par rprom1
    Citation Envoyé par le y@m's
    Tu peus charger ton fichier texte dans un String puis il ne te reste plus qu'à faire un split("\\."), ce qui te donnera un tableau de String de toutes les phrases.
    Ta solution m'interesse mais je ne vois pas excatement comment l'utiliser...
    Faut que je fasse ça?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String[] monTableauDeChaines = maChaine.split("\\.");
    Exact, où maChaine est le texte de ton fichier.
    Cependant ma solution ne me semble pas adapté aux fichiers de taille conséquente. Si tu ne travaille pas avec des fichiers trop gros il ne devrait pas y avoir de soucis mais dans le cas contraire la solution d'anykeyh me paraît plus appropriée.
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  10. #10
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Citation Envoyé par anykeyh
    Citation Envoyé par dedeloux
    Je pense que lire caratère par caractère n'est pas une bonne idée mais tu peux toujours le faire si ton fichier n'est pas trop gros.

    Pour lire caractère par caractère, il te suffit de parcourir ta chaine avec une boucle for ou while.
    L'interet de lire byte a byte est justement lorsqu'on ne peut pas charger le contenu du fichier en memoire, lorsqu'il est trop gros.

    Non, personnelement, j'utiliserai un bufferedInputStream (celui ci charge une partie du fichier en memoire pour accelerer la lecture), et je lirai caractere par caracteres, modifiant tout les '.' en '\r\n' vers un OutputStream

    Enfin si c'est des fichiers leger (<1Mo), tu peu aussi lire tout dans un tableau de Bytes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    File f = new File(filename);
    byte[] b = new byte[f.length];
    FileInputStream fis;
    try{
     fis = new FileInputStream(f);
     fis.read(b);
     String s = new String(b);
     String[] phrases = s.split("\\.");
     } catch (IOException e)
    {
      e.printStackTrace();
    } finally
    {
     fis.close();
    }
    Ton idée me paraît bonne mais dans ton code tu instancie un tableau de byte de la longueur du fichier ce que me paraît revenir au même problème en cas de gros fichier.
    J'ai repris ton code mais avec un buffer de taille fixe. Dis moi ce que t'en pense (ps : vite fais et pas testé).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    File f = new File(filename);
    byte[] buffer = new byte[2048];
    FileInputStream fis;
    List<String> phrases = new ArrayList<String>();
     
    try{
     fis = new FileInputStream(f);
     String lastString = "";
     while(fis.available()) {
          String newLastString = "";
          int nbRead = fis.read(buffer);
          String s = new String(buffer);
          String []tab = s.split("\\.");
          int nbPhrases = tab.length;
     
          if(! s.trim().endsWith(".")) {
               newLastString = tab[nbPhrases];
               nbPhrases --;
          }
          for(int i = 0; i < nbPhrases; i ++) {
                  phrases.add(tab[i] + ((i == 0) ? lastString : ""));
          }
          lastString = newLastString;
     }
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
     fis.close();
    }
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  11. #11
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 87
    Par défaut
    La solution porposée par anykeyh a l'air de marcher... cependant comment faire si je veux découper en fonction des "." mais aussi des "!" et des "?"...
    est-ce qu'une succession de split sur un tableau de String à chaque fois peut marcher?


    Un autre point également: le split m'enlève mon séparateur, ici en l'occurrence le "."... Comment faire pour qu'il le laisse?

  12. #12
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Citation Envoyé par rprom1
    comment faire si je veux découper en fonction des "." mais aussi des "!" et des "?"...
    split utilise les expressions regulières, il te suffit donc d'indiquer le pattern qui te convient.

    Citation Envoyé par rprom1
    le split m'enlève mon séparateur, ici en l'occurrence le "."... Comment faire pour qu'il le laisse?
    Si tu veus garder les delimiteurs passe plutôt par un StringTokenizer pour découper ta chaine.
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  13. #13
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 87
    Par défaut
    Merci à tous pour votre aide... je ne sais pas encore quelle solution je vais choisir car plusieurs d'entre elles fonctionnent très bien!
    Merci encore et à bientôt sur ce forum!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. java : lire fichier texte application web (war)
    Par drob38 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 07/07/2009, 23h31
  2. Lire fichier texte par morceaux
    Par lilibert dans le forum MATLAB
    Réponses: 1
    Dernier message: 12/07/2007, 09h37
  3. [VB.NET 2.0] lire fichier text
    Par Emcy dans le forum Windows Forms
    Réponses: 4
    Dernier message: 20/12/2006, 08h45
  4. Lire fichier texte
    Par kinouseb dans le forum VC++ .NET
    Réponses: 2
    Dernier message: 08/11/2006, 17h01
  5. Lire fichier texte en respectant la police, la forme
    Par loupin dans le forum Langage
    Réponses: 2
    Dernier message: 10/07/2006, 22h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo