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 et extraire les textes d'un fichier srt


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2015
    Messages : 4
    Par défaut Lire et extraire les textes d'un fichier srt
    Bonjour

    je dois écrire un programme java qui lit un fichier.srt (sous titres) et mettre les lignes dans une liste de String, mais je ne dois garder que le texte. mon fichier est comme ceci :
    1
    00:00:00,535 --> 00:00:02,462
    Je suis professeur d'informatique et
    d'ingéniérie informatique

    2
    00:00:02,462 --> 00:00:04,389
    à Carnegie Mellon,

    3
    00:00:04,389 --> 00:00:06,318
    et mes recherches se concentrent sur
    l'utilisabilité de la vie privée

    donc je dois éliminer toute les informations qui font référence au numéro et à la durée. j'ai donc fait ceci
    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
                    SoustitOrigin = new ArrayList<String>();
    		SoustitTrad = new ArrayList<String>();
    		BufferedReader br;
    		try {
    			br = new BufferedReader(new FileReader(fileName));
    			String line;
     
    			 while ((line = br.readLine()) != null)
    			 {
     
     
    				SoustitOrigin.add(line);
     
    			}
    			br.close(); 
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    mais bien sur je prends tout ce qu'il ya dans le fichier

    merci pour votre aide

    Ps le ficher est en pièce jointe
    Fichiers attachés Fichiers attachés

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Hello,

    Il faut juste que tu utilises une variable pour te rappeler où tu en es dans le fichier.

    Au départ "Ah, là je suis au début du fichier, j'attends un numéro de sous-titre."
    Puis "J'ai eu le numéro, là j'attends les timestamps"
    Puis "J'ai eu les timestamps, à partir de maintenant c'est le texte du sous-titre, je dois le mettre dans ma liste"
    Puis "J'ai eu une ligne vide, le sous-titre est fini, j'attends le numéro du prochain sous-titre."
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2015
    Messages : 4
    Par défaut Re thelvin
    merci pour ta réponse rapide thelvin, si je comprends bien je dois faire des br.readLine() ppour lire le numero et les timestamps, et puis un autre readline() pour le texte , mais le problème c que j'ai des fois du texte sur une ligne et des fois sur plusieurs lignes avant d'avoir la ligne vide, et je suis bloqué dessus ...
    encore une fois merci pour ton temps

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Ce que te dis @thelvin, c'est d'utiliser une variable qui contient une information qui va te permettre au programme de savoir ce qu'il attend à lire dans la ligne courante.

    Le pseudocode sera en gros comme ça (j'ai appelé la variable en question typeDeLigne) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    typeDeLigne = premier type de ligne
    tant qu'il y a des lignes à lire, lire une ligne 
         si typeDeLigne est type1 alors
                 lire dans ligne les données correspondant à type1
         sinon si typeDeLigne est type2 alors
                 lire dans ligne les données correspondant à type2
         sinon ... etc
         fin si
         si typeDeLigne est le dernier type alors
            typeDeLigne = premier type de ligne
         sinon        
            typeDeLigne = type de ligne suivant typeDeLigne
         fin si     
    fin tant que
    Tu peux par exemple utiliser une enum pour des types de ligne et utiliser un switch au lieu du si/sinon si/ pour simplifier et rendre plus clair le code. Tu peux aussi mettre une méthode parse() pour éviter ce switch, mais ça rendra plus complexe la récupération des données parsées.

    Maintenant, pour ton problème de lignes multiples, il suffit de changer légèrement l'algorithme. On passe au premier type non pas dès qu'on a lu une ligne, mais dès qu'on a lu une ligne vide :

    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
    typeDeLigne = premier type de ligne
    tant qu'il y a des lignes à lire, lire une ligne 
         si typeDeLigne est type1 alors
                 lire dans ligne les données correspondant à type1
         sinon si typeDeLigne est type2 alors
                 lire dans ligne les données correspondant à type2
         sinon ... etc
         fin si
         si typeDeLigne est le dernier type alors
            si ligne est vide alors // on ne repasse au premier type que si on vient de lire une ligne vide
                typeDeLigne = premier type de ligne
            fin si
         sinon        
            typeDeLigne = type de ligne suivant typeDeLigne
         fin si     
    fin tant que
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2015
    Messages : 4
    Par défaut Re : joel.drigo
    merci pour ta réponse
    j'ai fait un peu ce que tu m'as dit, et ca donne ca :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    try {
    			br = new BufferedReader(new FileReader(fileName));
    			String line = "";
     
    			int type = 1 ;
     
     
    			do 	 {
    					 switch (type)
    					 {
    					 case 1 : 
    					 {					 
    						 line = br.readLine();	
    						 type++;
     
    					 }
     
    					 case 2 :
    					 {
    						 line = br.readLine();
    						 type++;
     
    					 }
     
    					 case 3:
    					 { 
    						 line = br.readLine();
     
    						 if (line.isEmpty())
    						 {
    							 type = 1;
    							}
    						 else
    							 SoustitOrigin.add(line);					 
     
    					 }
    					 }
     
    			 } while (line != null);
     
    			br.close(); 
    			} catch (IOException e) {
    			e.printStackTrace();
    		}
    mais quand j’exécute ça me donne une NullPointerException , j'ai essayé line != "" et line != "\n" ca me donne la meme exception, je ne sais pas s'il y a un probleme avec mon code...

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    J'ai jamais dit de remplacer le while par un do/while. La lecture de la ligne dans le fichier ne doit pas changer (ou alors changer en faveur d'un for : for(String line=br.readLine(); line!=null; line=br.readLine()) { qui a l'avantage de limiter la portée de la variable line, en ayant toutefois l'inconvénient de doubler l'appel de readLine()). C'est la lecture dans la ligne qui est conditionnée par le type. Le parsage de line si tu préfères. Avec ton code, à la fin du fichier, le br.readLine() retourne null, et tu testes isEmpty() sur ce null, d'ù NullPointerException().

    Par ailleurs, dans un switch, il faut utiliser break à la fin d'un cas, sinon le code du cas suivant est appliqué aussi.

    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
    String line = "";
    int type = 1 ;
     
    while ( (line=br.readLine())!=null ) {
       switch (type) {
       case 1 : 
          // récupérer le numéro (lignes 1, 2, 3...)
          type++;
          break;
       case 2 :
          // parser les lignes du type 00:00:00,535 --> 00:00:02,462 (l'intervalle de temps)
          type++;
          break; 
       case 3:
          if (line.isEmpty()) {
              type = 1;
          } else {
    	SoustitOrigin.add(line);					 
          }
       }
    }
    A noter que tous les textes vont dans une même liste. C'est normal ? Enfin, si c'est ce que tu veux faire...

    Par ailleurs, il faut toujours garantir l'exécution de br.close(), y compris en cas d'exception lors de l'appel du readLine(). Soit par une structure try/finally, soit plus simple par un try-with-resource.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    try(BufferedReader br = Files.newBufferedReader(Paths.get(filename))) {
         // ici la boucle de lecture
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

Discussions similaires

  1. macros word et lecture dans un fichier excel
    Par antrax2013 dans le forum Windows
    Réponses: 2
    Dernier message: 01/10/2005, 19h05
  2. Réponses: 20
    Dernier message: 25/09/2005, 15h07
  3. Lecture dans un fichier
    Par unknown4 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 14/08/2005, 17h56
  4. [Débutant] Lecture dans un fichier texte
    Par babemagus dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 07/07/2005, 12h17
  5. Réponses: 12
    Dernier message: 14/06/2004, 13h06

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