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

Java Discussion :

Ecrire des fichiers textes à partir d'un seul fichier en entrée


Sujet :

Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 49
    Points : 28
    Points
    28
    Par défaut Ecrire des fichiers textes à partir d'un seul fichier en entrée
    Bonjour à tous,
    Je souhaite réaliser un programme qui permet de lire un fichier texte et fournir plusieurs fichiers textes en sortie. Le fichier d'entrée subira un parsing (ligne par ligne). S'il trouve "*TEXT ", alors il va rassembler les lignes et les écrire dans un nouveau fichier jusqu'à ce qu'il trouvera la prochaine "*TEXT ",un nouveau fichier ainsi de suite.
    Mon fichier contient 425 fois "*TEXT ", donc j'obtiendrai normalement 425 fichiers texte en sortie. J'obtient qu'un seul fichier et qui est vide. Est-il possible de m'indiquer où est l'erreur.
    Voici mon code

    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
     
    import java.io.*;
    public class ReadFile {
    	public static void main(String[] args){
    		String chaine = "";
    		String fichier = "TIME.ALL";
                    String chercher = "*TEXT ";
    		int i=0;
                    int res;
                    String ligne;
    		//lecture du fichier texte	
    		try{
    			InputStream ips = new FileInputStream(fichier); 
    			InputStreamReader ipsr = new InputStreamReader(ips);
    			BufferedReader br = new BufferedReader(ipsr);
    			while ((ligne=br.readLine())!=null){
     
    				//System.out.println(ligne);
                                    res= ligne.indexOf(chercher);
                                    System.out.println(ligne);
                                    System.out.println(res);
                                    // S'il trouve "recherche" dans la ligne, i s'incrémente pour le numéro de fichier
                                    if (res == 0) 
                                    {i=i+1; }
                                    //S'il ne trouve pas "recherche", incrémentation de chaine qui va ^étre écrite dans le fichier
                                    while (res == -1)
                                    {
                                       chaine+=ligne+"\n"; 
                                    }
                                    PrintWriter pw = new PrintWriter (new BufferedWriter (new FileWriter ("Fichier"+i+".txt", true)));
                                    pw.println (chaine); 			}
     
     
    			br.close(); 
                            pw.close();
                            System.out.println("Le fichier " + fichier + " a été créé!");
    		}		
    		catch (Exception e){
    			System.out.println(e.toString());
    		}
     
     
    	}
    }
    Merci pour toute sorte d'aide

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 250
    Points : 403
    Points
    403
    Par défaut
    La méthode indexOf renvoie la position de la sous-chaîne recherchée (chercher) dans la chaîne principale (ligne) (voire javadoc)
    Ton instruction "if (res == 0)" signifie donc ==> si ma sous-chaîne recherchée est à la position zéro dans la chaîne principale alors incrémente i.
    Bref, cette condition n'est vérifiée que si le contenu de ta variable "ligne" commence par "*TEXT".
    Plusieurs solutions:
    1. Soit tu change ton instruction en "if (res>0)"
    2. Soit tu utilises la méthode contains "if ligne.contains(chercher)"

  3. #3
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    A noter qu'avec le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (res == 0) 
        {i=i+1; }
    //S'il ne trouve pas "recherche", incrémentation de chaine qui va ^étre écrite dans le fichier
    while (res == -1) {
        chaine+=ligne+"\n"; 
    }
    Si le mot n'est pas trouvé, on a théoriquement un nombre infini de "ligne" dans chaine (en réalité, un dépassement de mémoire). Et si le mot l'est, chaine est vide (on ne rentre pas dans la boucle). C'est plutôt quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if ( res==-1 ) {
       // mot pas trouvé
       // on cumule ligne dans chaine
    } else {
       // mot trouvé
       // on incrémente le numéro de fichier
       // on créé un fichier si chaine n'est pas vide (et on écrit chaine dedans)
       // on réinitialise chaine  (sinon chaque nouveau fichier contiendra le contenu des fichiers précédents
    }
    Au passage, il serait mieux d'utiliser un StringBuilder pour cumuler les lignes, plutôt qu'une concaténation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StringBuilder chaine = new StringBuilder(); // pour déclarer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaine.append(ligne); // pour cumuler (sans gestion de \n (à faire de même))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaine.toString(); // pour récupérer la chaine cumulée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaine.setLength(0); // pour remettre à zéro (vide)
    Ou encore écrire au fur et à mesure directement dans le fichier sans passer par une chaine intermédiaire.

    [EDIT]l'acccolade fermante du while de lecture du fichier en entrée est avant br.close(); alors qu'elle devrait être après au minimum (en fait il faudrait plutôt utiliser soitun try finally, soit, mieux, un try-with-resource)
    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.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 49
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if ( res==-1 ) {
       // mot pas trouvé
       // on cumule ligne dans chaine
    } else {
       // mot trouvé
       // on incrémente le numéro de fichier
       // on créé un fichier si chaine n'est pas vide (et on écrit chaine dedans)
       // on réinitialise chaine  (sinon chaque nouveau fichier contiendra le contenu des fichiers précédents
    }
    Si on fait "if" au lieu de "while", la variable chaine ne prendra qu'une seule ligne, non?
    Comment peut-on écrire dans le fichier directement?

  5. #5
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par hajer.d Voir le message
    Si on fait "if" au lieu de "while", la variable chaine ne prendra qu'une seule ligne, non?
    C'est le while qui dans while ((ligne=br.readLine())!=null){ qui lit chaque ligne du fichier en entrée : à chaque itération on a une ligne et on l'écrit dans une destination (par concaténation dans un chaine, par append() dans un StringBuilder, par println dans un PrintStream, etc...)
    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.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 49
    Points : 28
    Points
    28
    Par défaut
    Voilà que j'ai changé mon code grâce à vos conseil. Un autre problème: retourne des fichiers vides!
    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
    45
    46
    47
    48
     
    import java.io.*;
    public class ReadFile {
        public static void main(String[] args)
        {
    	String fichier = "TIME.ALL";
            String chercher = "*TEXT ";
    	int i=0;
            boolean res; 
            String stop = "*STOP";
            String ligne;
    		//lecture du fichier texte	
                try{
    		InputStream ips = new FileInputStream(fichier); 
    		InputStreamReader ipsr = new InputStreamReader(ips);
    		BufferedReader br = new BufferedReader(ipsr);
                    StringBuilder chaine = new StringBuilder();
     
                        while (((ligne=br.readLine()).contains(stop))== false)
                        {
                            res = ligne.contains(chercher);
                            System.out.println(ligne);
                            System.out.println(res);
                                if ( res == false ) 
                                {// on cumule ligne dans chaine
                                chaine.append(ligne);
                                chaine.toString();
                                } 
                                else 
                                {// on incrémente le numéro de fichier
                                i=i+1;
                                // on créé un fichier si chaine n'est pas vide (et on écrit chaine dedans)
                                PrintWriter pw = new PrintWriter (new BufferedWriter (new FileWriter ("Fichier"+i+".txt", true)));
                                pw.println (chaine);
                                // on réinitialise chaine  (sinon chaque nouveau fichier contiendra le contenu des fichiers précédents
                                chaine.setLength(0);
                                }
                        }
                        br.close(); 
                        pw.close();
                        System.out.println("Le fichier " + fichier + " a été créé!");
    		}		
    		catch (Exception e)
                    {
    		System.out.println(e.toString());
    		}
    	}
    }
    Citation Envoyé par joel.drigo Voir le message
    [EDIT]l'acccolade fermante du while de lecture du fichier en entrée est avant br.close(); alors qu'elle devrait être après au minimum (en fait il faudrait plutôt utiliser soit un try finally, soit, mieux, un try-with-resource)
    J'ai essayer ceci, il ne retourne q'un seul fichier.

    Citation Envoyé par joel.drigo Voir le message
    Au passage, il serait mieux d'utiliser un StringBuilder pour cumuler les lignes, plutôt qu'une concaténation :
    Ou encore écrire au fur et à mesure directement dans le fichier sans passer par une chaine intermédiaire.
    Je suis enthousiaste pour l'idée d'écrire directement dans le fichier, mais je ne sais pas comment la réaliser?

  7. #7
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 49
    Points : 28
    Points
    28
    Par défaut
    J'ai oublié de mentionner qu'il retourne que 423 fichiers parmi 425.
    Le premier fichier ne contient que le titre "*TEXT ..." et pas de texte. Alors que le deuxième prend le texte du premier fichieret à la fin le titre du fichier num 3 "*TEXT ...". Pareil pour les autres fichiers.
    Comment je peux régler les fichiers: titre+texte dans chaque fichier?

    Voici mon code avec des modifications:
    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
    45
    46
    47
    48
    49
    50
    51
     
    import java.io.*;
    public class ReadFile {
        public static void main(String[] args)
        {
    	String fichier = "TIME.ALL";
            String chercher = "*TEXT ";
    	String stop = "*STOP";
            String ligne;
            int i=0;
            boolean res; 
        	//lecture du fichier texte	
                try{
    		InputStream ips = new FileInputStream(fichier); 
    		InputStreamReader ipsr = new InputStreamReader(ips);
    		BufferedReader br = new BufferedReader(ipsr);
                    StringBuilder chaine = new StringBuilder();
     
                        while (((ligne=br.readLine()).contains(stop))== false)
                        {
                            res = ligne.contains(chercher);
                            //System.out.println(ligne);
                            //System.out.println(res);
                            if ( res == true )
                                {i=i+1;
                                chaine.append(ligne);
                                PrintWriter pw = new PrintWriter (new BufferedWriter (new FileWriter ("Fichier"+i+".txt", true)));
                                pw.println(chaine);
                                chaine.setLength(0);
                                pw.close();
     
                                }
     
                                else 
                                {// on cumule ligne dans chaine
                                chaine.append(ligne);
                                chaine.toString();
                                } 
     
                        }
                        br.close(); 
     
     
                        System.out.println("Les fichiers ont été créés!");
    		}		
    		catch (Exception e)
                    {
    		System.out.println(e.toString());
    		}
    	}
    }

  8. #8
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    1) Pour la gestion du close() :

    le close doit être fait pour chaque writer, donc au moins
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    PrintWriter pw = new PrintWriter (new BufferedWriter (new FileWriter ("Fichier"+i+".txt", true)));
    pw.println (chaine);
    pw.close(); 
    // on réinitialise chaine  (sinon chaque nouveau fichier contiendra le contenu des fichiers précédents
    chaine.setLength(0);
    Mais dans ce cas, s'il y a une erreur lors de l'écriture, le flux n'est pas correctement fermé, donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    PrintWriter pw = new PrintWriter (new BufferedWriter (new FileWriter ("Fichier"+i+".txt", true)));
    try {
    pw.println (chaine);
    } finally {
    pw.close(); 
    }
    // on réinitialise chaine  (sinon chaque nouveau fichier contiendra le contenu des fichiers précédents
    chaine.setLength(0);
    Depuis Java 7, il y a une syntaxe spéciale, appelée try-with-resource :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    try (PrintWriter pw = new PrintWriter (new BufferedWriter (new FileWriter ("Fichier"+i+".txt", true)));) {
    pw.println (chaine);
    } 
    // on réinitialise chaine  (sinon chaque nouveau fichier contiendra le contenu des fichiers précédents
    chaine.setLength(0);
    2) pour avoir la ligne qui contient TEXT dans le fichier, il faut faire append() de cette ligne également (donc que res soit 0 ou pas, mais après avoir réinitialisé le StringBuilder


    3) Avec cette structure de programme, on écrit le fichier quand on trouve, on écrit ce qu'on vient de cumuler dans le StringBuilder à chaque fois qu'on trouve TEXT.

    La première fois, on a rien dedans (sauf si la première ligne ne contient pas TEXT). A la fin du fichier, on n'écrit pas ce qu'il y a dans le StringBuilder, puisqu'il n'y a pas de mot TEXT à la fin, mais tu a résolu ça en mettant en place un mot STOP. Par contre, si le fichier ne contient pas ce mot, tu auras une NullPointerException dans le while arrivé à la fin du fichier.

    Pour traiter le dernier fichier, il faut juste tester après le while si chaine.getLength() ne vaut pas 0.

    En résumé, voici ma version :

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    	/***
             * 
             * @param file fichier en entrée
             * @param outputDir répertoire pour les fichiers en sortie
             * @param outputName nom du fichier en sortie avec {0} pour l'emplacement du numéro (exemple : "fichier{0}.txt")
             * @param startWord le mot qui commence chaque partie
             * @param charset le type d'encodage 
             * @throws IOException
             */
    	public static void splitFile(File file, File outputDir, String outputName, String startWord, Charset charset) throws IOException {
     
    		// pour gérer le nommage de manière complète et générique
    		MessageFormat outputNameFormat;
    		if ( !outputName.contains("{0}") ) {
    			int index = outputName.lastIndexOf("."); // on cherche l'extension
    			if ( index<0 ) {
    				outputNameFormat = new MessageFormat(outputName  + "{0}");
    				outputName = outputName + "{0}";
    			}
    			else {
    				// on intercale le pattern avant l'extension
    				outputNameFormat = new MessageFormat( outputName.substring(0, index) + "{0}" + outputName.substring(index));
    			}
    		}
    		else {
    			outputNameFormat = new MessageFormat( outputName );
    		}
    		//
     
    		StringBuilder buffer = new StringBuilder(); // pour cumuler les lignes lues
    		int fileIndex = 1; // pour gérer l'index de fichier de sortie
    		try ( BufferedReader reader = Files.newBufferedReader(file.toPath(), charset) ) { // le try avec les parenthèses = try-with-resource : close() sera automatiquement appelé à la fin du bloc
    			// pour la création du reader, une syntaxe introduite en Java 8 équivalent à BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF8"))
     
    			for(String line = reader.readLine(); line!=null; line = reader.readLine() ) {
     
    			/* NB si tu veux introduire un mot de fin (STOP), la ligne sera :
    			   for(String line = reader.readLine(); line!=null && !line.contains(stopWord) ; line = reader.readLine() ) {
    	 		   attention : la ligne contenant STOP ne sera jamais dans aucun fichier en sortie */
     
    				if ( line.contains( startWord ) && buffer.length()!=0 ) {
     
    					// on écrit le fichier courant, s'il n'est pas vide
    					writeFile(outputDir, outputNameFormat, fileIndex, charset, buffer);
    					buffer.setLength(0); // on remet à zéro le buffer
    					fileIndex++; 
     
    				}
     
    				// dans tous les cas on ajoute la ligne au buffer
    				if( buffer.length()!=0 ) {
    					// retour à ligne entre chaque ligne sauf la première
    					buffer.append('\n'); 
    				}
    				buffer.append(line); // on ajoute la ligne lue dans le buffer
     
     
    			}
    			// à la fin, il faut écrire ce qu'il y a dans le buffer
    			if ( buffer.length()!=0 ) {
     
    				// on écrit le fichier courant, s'il n'est pas vide
    				writeFile(outputDir, outputNameFormat, fileIndex, charset, buffer);
     
    			}
     
    		}
     
    	}
     
    	private static void writeFile( File outputDir, MessageFormat outputNameFormat, int fileIndex, Charset charset, StringBuilder buffer) throws IOException {
    		try ( BufferedWriter writer = 
    				Files.newBufferedWriter( new File(outputDir, outputNameFormat.format(fileIndex)).toPath(), charset ) ) {
    			writer.write(buffer.toString());
    		}
    	}
    4) Pour écrire directement dans les fichiers, donc se passer du StringBuilder :

    On remplace le StringBuilder par un Writer. Comme on va devoir créer un nouveau fichier exactement dans la même condition, il faudra faire le close() du fichier précédent avant de créer le nouveau, et aussi à la fin. Il faudra gérer le cas particulier du fichier en entrée vide (aucun fichier ne devrait être créé), en testant la taille du fichier avant de commencer. On pourrait d'ailleurs le faire également dans le code précédent, pour éviter d'ouvrir le fichier en lecture.

    Ce qui pourrait donner ça par exemple :

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    /***
             * 
             * @param file fichier en entrée
             * @param outputDir répertoire pour les fichiers en sortie
             * @param outputName nom du fichier en sortie avec {0} pour l'emplacement du numéro (exemple : "fichier{0}.txt")
             * @param startWord le mot qui commence chaque partie
             * @param charset le type d'encodage 
             * @throws IOException
             */
    	public static void splitFile(File file, File outputDir, String outputName, String startWord, Charset charset) throws IOException {
     
    		if ( file.length()==0 ) return; // si le fichier est vide on ne fait rien
     
    		// pour gérer le nommage de manière complète et générique
    		MessageFormat outputNameFormat;
    		if ( !outputName.contains("{0}") ) {
    			int index = outputName.lastIndexOf("."); // on cherche l'extension
    			if ( index<0 ) {
    				outputNameFormat = new MessageFormat(outputName  + "{0}");
    				outputName = outputName + "{0}";
    			}
    			else {
    				// on intercale le pattern avant l'extension
    				outputNameFormat = new MessageFormat( outputName.substring(0, index) + "{0}" + outputName.substring(index));
    			}
    		}
    		else {
    			outputNameFormat = new MessageFormat( outputName );
    		}
    		//
     
    		int fileIndex = 1; // pour gérer l'index de fichier de sortie
    		BufferedWriter writer = createWriter(outputDir, outputNameFormat, fileIndex, charset);
    		try ( BufferedReader reader = Files.newBufferedReader(file.toPath(), charset) ) { // le try avec les parenthèses = try-with-resource : close() sera automatiquement appelé à la fin du bloc
    			// pour la création du reader, une syntaxe introduite en Java 8 équivalent à BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF8"))
     
    			boolean firstLine = true; // pour gérer le \n
    			for(String line = reader.readLine(); line!=null; line = reader.readLine() ) {
     
    			/* NB si tu veux introduire un mot de fin (STOP), la ligne sera :
    			   for(String line = reader.readLine(); line!=null && !line.contains(stopWord) ; line = reader.readLine() ) {
    	 		   attention : la ligne contenant STOP ne sera jamais dans aucun fichier en sortie */
     
    				if ( line.contains( startWord ) ) {
     
    					writer.close(); // on ferme le précédent
    					// on créé un nouveau fichier
    					fileIndex++; 
    					firstLine=true;
    					writer = createWriter(outputDir, outputNameFormat, fileIndex, charset);
     
    				}
    				if ( firstLine ) {
    					firstLine=false;
    				}
    				else {
    					writer.write('\n'); 
    				}
    				writer.write(line); // on ecrit la ligne lue dans le fichier
     
     
    			} 
     
    		} finally {
    			writer.close();
    		}
     
    	}
     
    	private static BufferedWriter createWriter( File outputDir, MessageFormat outputNameFormat, int fileIndex, Charset charset) throws IOException {
    		return Files.newBufferedWriter( new File(outputDir, outputNameFormat.format(fileIndex)).toPath(), charset );
    	}
    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.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 49
    Points : 28
    Points
    28
    Par défaut
    Merci Mr pour l'interrêt que avez montré.
    Citation Envoyé par joel.drigo Voir le message
    La première fois, on a rien dedans (sauf si la première ligne ne contient pas TEXT). A la fin du fichier, on n'écrit pas ce qu'il y a dans le StringBuilder, puisqu'il n'y a pas de mot TEXT à la fin, mais tu a résolu ça en mettant en place un mot STOP. Par contre, si le fichier ne contient pas ce mot, tu auras une NullPointerException dans le while arrivé à la fin du fichier.
    En fait, le fichier "TIME.ALL" commence par le titre "*TEXT..." (qui se répète 425 fois) et finit par "*STOP"(qu'à la fin du fichier).
    D'ailleurs, j'ai ajouté ceci quand il trouve le titre càd (res==true) pour que la prochaine itération chaine prendra en considération le titre,
    Je vais essayer votre code, je vous mettrai au courant des résultats.

  10. #10
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 49
    Points : 28
    Points
    28
    Par défaut
    Euuh, j'ai pas su intégrer votre code! Je l'ai mis juste après la classe void main mais tjr dans la classe "ReadFile"c'est juste, non?
    Y a t-il des paramètres à régler?

  11. #11
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Il y a des paramètres à passer, oui (comme indiqué dans la javadoc de la méthode). Tu peux mettre les méthodes dans ta classe ReadFile comme ça par exemple :

    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
    public class ReadFile {
     
        public static void main(String[] args) {
    	String fichier = "TIME.ALL";
            String chercher = "*TEXT ";
     
            // appel 
            try {
                 File file = new File(fichier);
                 File outputDir = getAbsoluteFile().getParentFile(); // ou new File("c:/temp") si tu veux
                 splitFile(file, outputDir, "fichier{0}.txt", chercher, Charset.forName("UTF8")); // le charset ça dépend de tes fichiers (ça peut être aussi Charset.forName("ISO8859-1")
            }
            catch(IOException e) {
                 // en cas d'erreur
                 e.printStackTrace(); 
            }
     
        }
     
       // ici le code d'un des exemples (les deux exemples ne peuvent  pas cohabiter dans la même classe)
       public static void splitFile( ...
       }
     
       private static void writeFile( ... 
       }
     
    }
    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.

  12. #12
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 49
    Points : 28
    Points
    28
    Par défaut
    Salut,
    J'ai pas vraiment compris:
    "comme indiqué dans la javadoc de la méthode"
    J'ai eu cet affichage. Est ce que "MessageFormat" nécessite une importation?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - cannot find symbol 
    symbol:   class MessageFormat
    location: class ReadFile
    at ReadFile.splitFile(ReadFile.java:28)
    at ReadFile.main(ReadFile.java:15)
    Java Result: 1

  13. #13
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 49
    Points : 28
    Points
    28
    Par défaut
    Salut,
    J'ai pas vraiment compris:
    "comme indiqué dans la javadoc de la méthode"
    J'ai eu cet affichage. Est ce que "MessageFormat" nécessite une importation?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - cannot find symbol 
    symbol:   class MessageFormat
    location: class ReadFile
    at ReadFile.splitFile(ReadFile.java:28)
    at ReadFile.main(ReadFile.java:15)
    Java Result: 1

  14. #14
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 49
    Points : 28
    Points
    28
    Par défaut
    J'ai fait les importations suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    import java.io.*;
    import java.nio.charset.Charset;
    import java.nio.file.Files;
    import java.text.MessageFormat;
    Mais j'obtiens les erreurs suivants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to [Ljava.lang.Object;
    	at java.text.MessageFormat.format(MessageFormat.java:865)
    	at java.text.Format.format(Format.java:157)
    	at ReadFile.writeFile(ReadFile.java:91)
    	at ReadFile.splitFile(ReadFile.java:61)
    	at ReadFile.main(ReadFile.java:17)
    Comment je peux les dépasser ?

  15. #15
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Il y a une erreur en effet dans mon code :

    Il faut remplacer (dans les 2 exemples) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    outputNameFormat.format(fileIndex))
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    outputNameFormat.format(new Object[]{fileIndex}))
    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.

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/04/2015, 10h35
  2. Problème d'utilisation des fichiers textes à partir du JAR
    Par arbaoui_aek2005 dans le forum Général Java
    Réponses: 2
    Dernier message: 22/06/2011, 02h33
  3. Réponses: 6
    Dernier message: 07/06/2011, 12h00
  4. lecture des fichiers texte à partir d'espace FTP
    Par fishingman dans le forum ASP.NET
    Réponses: 5
    Dernier message: 07/06/2010, 02h12
  5. Comment générer un fichier texte à partir d'un XML et XSL
    Par Jayceblaster dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 24/07/2005, 23h42

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