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

Langage Java Discussion :

Recherche de chaine et copie dans fichier texte


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2013
    Messages : 63
    Par défaut Recherche de chaine et copie dans fichier texte
    Bonjour,

    Je rencontre plein de petit problème avec le langage Java, certain, j'arrive à les contourner mais d'autre me pose problème.
    En pièce jointe :
    temp.txt
    Dans ce fichier texte, le code source d'un site.
    Je voudrais extraire de se code source, les lignes correspondant au réunion du 02-09-2014 (ligne 73 à 85 (incluse))
    pour l'instant, le bout de code que j'ai réussi à faire est :
    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
     
    public static void reunion()
    	{
    		String aujourdhui = (date_jour.main(null)); //ceci est juste une méthde appelée qui me formate la date du jour avec ce format :dd-MM-yyyy
    		int pos1=0;
    		int pos2=0;
    	try
    		{
    		OutputStream output = new FileOutputStream("reunion.txt");
    		BufferedReader br = new BufferedReader (new FileReader("temp.txt"));
    		BufferedReader br2 = new BufferedReader (new FileReader("temp.txt"));
    		try
    			{
    			String ligne;//me permet de trouver la prmemière apparition de la date du jour
    			String ligne2;//utiliser pour la seconde boucle while
    			boolean reunionTrouve = false;
    			while ((ligne=br.readLine()) !=null)
    				{
    				if (reunionTrouve ==  false)
    					{
    					if ( ligne.indexOf(aujourdhui) != -1)//je recherche la ligne de la première apparition de la date du jour
    						{
    						reunionTrouve = true;
    						while ((ligne2=br2.readLine()) !=null)	//je fais une deuxième boucle mais en incluant un if pour ne copié qu'à partir de la date du jour
    							{
    								if (pos2 >=pos1) //copie à partir de la première apparaition de la date du jour
    									{
    									//écriture
    									System.out.println(ligne2); //ce que j'obtiens dans la console pour l'instant (voir seconde pièce jointe), mais je n'arrive pas trouver la syntaxe correcte pour l'écrire dans l'output, j'ai essayé les output.write ou print ouprintln avec ligne2 dans l'argument
    									}
    							pos2++;
    							}
    						}
    					}
    				pos1++;
    				}
    			}
    		finally
    			{
     
    			br.close();
    			br2.close();
    			}
    		}
    	catch (IOException ioe)
    		{
    		//fermeture des flux
    		System.out.println("Erreur --" + ioe.toString());
    		}
    	}
    Voici ce que j'obtiens dans ma console :
    console.txt
    Donc en gros récupérer, mes première ligne ou figure la date du jour, mettre ça dans un fichier texte appeler réunion et supprimer les lignes vides

    Dans un second temps, je vais récupérer le lien de la page de la réunion, le nom de la réunion et mettre dans un BDD (type MySQL), mais chaque chose en son temps, j'aime bien la recherche (mais si vous voyer une méthode plus directe ou plus simple, je suis preneur de toute idée)

    Merci

  2. #2
    Membre très actif Avatar de Sennad
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Août 2014
    Messages : 180
    Par défaut
    Salut,

    Pour écrire dans un fichier tu peux utiliser cette méthode
    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
    public static final void writeInFile (String lineToWrite, String pathOfFileToWrite) {
            try
            {
                File f = new File(pathOfFileToWrite);
                if (!f.exists()) {
                    f.createNewFile();
                }
                FileWriter fw = new FileWriter(pathOfFileToWrite, true);
                BufferedWriter output = new BufferedWriter(fw);
                output.write(DateUtils.getCurrentDate() + " " + lineToWrite + "\n");
                output.flush();
                output.close();
                fw.close();
            }
            catch(IOException ioe){
                ioe.printStackTrace();
                System.out.println("Impossible to write in " + pathOfFileToWrite + "file !");
            }
        }
    Si tu as des questions n'hésite pas !

  3. #3
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2013
    Messages : 63
    Par défaut
    Merci, si j'ai bien compris ton code, j'appelle ta méthode avec deux arguments, le premier = ma ligne, le second mon fichier.

    J'insère cette appel à la fin de mon if pour que je lui dise quand l'écrire, si tu as une petite piste sur comment lui faire arrêter la copiela fin de ma copie
    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
     
    public static final void writeInFile (String lineToWrite, String pathOfFileToWrite) {
            try
            {
                File f = new File(pathOfFileToWrite);
                if (!f.exists()) {
                    f.createNewFile();
                }
                FileWriter fw = new FileWriter(pathOfFileToWrite, true); //permet de déclarer mon fichier destination
                BufferedWriter output = new BufferedWriter(fw);//mon tampon pour l'écriture
                output.write(lineToWrite + "\n");//écriture dans mon fichier
                output.flush();//nettoyage propre
                output.close();//fermeture de ma ressource
                fw.close();
            }
            catch(IOException ioe){
                ioe.printStackTrace();
                System.out.println("Impossible to write in " + pathOfFileToWrite + "file !");
            }
        }
    Si j'ai bien compris, elle fonctionne surper bien , mais il reste tout de même mon problème d'arrêt, je pourrais faire une copie jusqu'à ce que je trouve ma ligne de fin, mais ça va faire sale et me faire créer un autre fichier txt tampon, si quelqu'un a une bonne idée

    Merci Sennad, cette partie va à merveille.

  4. #4
    Membre très actif Avatar de Sennad
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Août 2014
    Messages : 180
    Par défaut
    Ma méthode permet juste d'écrire une ligne dans un fichier.
    Donc dès que tu as trouvé la ligne de ton fichier (code source du site) que tu veux écrire dans ton fichier réunion, tu appelles la méthode writeInFile(laLigneAEcrire, leCheminDuFichier).
    Donc pour "l'arrêt" c'est au niveau de ta boucle qui parcourt ton fichier (code source).
    Ca donnerait 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
    45
    46
    47
    48
    49
    public static void reunion()
    	{
    		String aujourdhui = (date_jour.main(null)); //ceci est juste une méthde appelée qui me formate la date du jour avec ce format :dd-MM-yyyy
    		int pos1=0;
    		int pos2=0;
    	try
    		{
    		OutputStream output = new FileOutputStream("reunion.txt");
    		BufferedReader br = new BufferedReader (new FileReader("temp.txt"));
    		BufferedReader br2 = new BufferedReader (new FileReader("temp.txt"));
    		try
    			{
    			String ligne;//me permet de trouver la prmemière apparition de la date du jour
    			String ligne2;//utiliser pour la seconde boucle while
    			boolean reunionTrouve = false;
    			while ((ligne=br.readLine()) !=null)
    				{
    				if (reunionTrouve ==  false)
    					{
    					if ( ligne.indexOf(aujourdhui) != -1)//je recherche la ligne de la première apparition de la date du jour
    						{
    						reunionTrouve = true;
    						while ((ligne2=br2.readLine()) !=null)	//je fais une deuxième boucle mais en incluant un if pour ne copié qu'à partir de la date du jour
    							{
    								if (pos2 >=pos1) //copie à partir de la première apparaition de la date du jour
    									{
    									writeInFile(ligne2, "test/test/test");
    									System.out.println(ligne2); //ce que j'obtiens dans la console pour l'instant (voir seconde pièce jointe), mais je n'arrive pas trouver la syntaxe correcte pour l'écrire dans l'output, j'ai essayé les output.write ou print ouprintln avec ligne2 dans l'argument
    									}
    							pos2++;
    							}
    						}
    					}
    				pos1++;
    				}
    			}
    		finally
    			{
     
    			br.close();
    			br2.close();
    			}
    		}
    	catch (IOException ioe)
    		{
    		//fermeture des flux
    		System.out.println("Erreur --" + ioe.toString());
    		}
    	}
    En gros dès que tu trouves la ligne qu'il faut tu l'écrit dans le fichier. C'est ça que tu cherches non ?
    Ou alors j'ai mal compris ?

  5. #5
    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
    Citation Envoyé par Sennad Voir le message
    Salut,

    Pour écrire dans un fichier tu peux utiliser cette méthode
    Euh, non. Merci de ne pas passer son temps à ouvrir/fermer des fichiers. Pendant qu'on y est, préciser l'encodage n'est pas du luxe, avec du HTML en français. Et enfin, c'est peut-être pas la peine de réinventer la roue.
    Voici une meilleure alternative :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static final void writeInFile (List<String> linesToWrite, String pathOfFileToWrite) throws IOException {
      Path path = Paths.get(pathOfFileToWrite);
      Files.write(path, linesToWrite, StandardCharsets.ISO_8859_1);
    }
    À appeler après avoir lu toutes les lignes. (Du coup y a pas vraiment besoin d'une méthode pour ça, celle fournie avec Java suffit largement.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre très actif Avatar de Sennad
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Août 2014
    Messages : 180
    Par défaut
    Ouais mais ça rajoute des contraintes.
    Il faut alors que tu créer un List<String> linesToWrite, et que t'y rajoute chaque ligne que tu veux écrire dans ton fichier, une fois que tu as fini de parcourir le fichier (code source) et donc que tu as fini de remplir la List, tu peux appeler la méthode en lui passant la List.
    Franchement ça ne fais pas une grande différence quand tu appelles la méthode 3/4 fois...
    C'est sûr que si tu dois appeler la méthode 100 fois, ou plus, effectivement ça commence a être un peu bourrin.. Seulement ce n’est pas son cas ici.
    Mais il faut pouvoir lister les lignes a écrire avant d'appeler la méthode, ce n’est pas toujours faisable.

    Ps : Je pense qu'un modérateur doit savoir expliquer ces idées humblement, sans essayer de rabaisser les autres, mais en expliquant avec respect pourquoi ça solution est meilleure que la/les autre/s...

  7. #7
    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
    Citation Envoyé par Sennad Voir le message
    Ouais mais ça rajoute des contraintes.
    Il faut alors que tu créer un List<String> linesToWrite, et que t'y rajoute chaque ligne que tu veux écrire dans ton fichier, une fois que tu as fini de parcourir le fichier (code source) et donc que tu as fini de remplir la List, tu peux appeler la méthode en lui passant la List.
    Ouais enfin, la contrainte de construire une liste, hein... Si cette méthode existe de base dans Java 1.7 c'est pas par hasard -_-°.
    Mais admettons que la contrainte soit trop lourde, dans ce cas l'alternative que je propose n'est pas bonne, mais ma remarque reste : merci de ne pas passer son temps à ouvrir et fermer des fichiers.
    À la place :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public static final void writeInFile(Writer writer, String lineToWrite) throws IOException {
      writer.write(lineToWrite + "\n");
    }
    Et on garde le BufferedWriter tant qu'on a besoin d'écrire dedans. Du coup une méthode pour ça est encore plus redondante avec juste appeler write().

    Citation Envoyé par Sennad Voir le message
    Franchement ça ne fais pas une grande différence quand tu appelles la méthode 3/4 fois...
    C'est sûr que si tu dois appeler la méthode 100 fois, ou plus, effectivement ça commence a être un peu bourrin.. Seulement ce n’est pas son cas ici.
    Mais il faut pouvoir lister les lignes a écrire avant d'appeler la méthode, ce n’est pas toujours faisable.
    Les performances de ce cas précis ne sont pas la question. Le problème est d'avoir même imaginé d'ouvrir et fermer le fichier à chaque ligne. De faire comme si ce n'était pas une aberration en soi, comme si ça se faisait.
    Car là tu viens d'enseigner à quelqu'un à le faire.
    - D'une part tu as jamais précisé qu'il fallait pas le faire pour plus de trois ou quatre lignes,
    - d'autre part puisque dans la plupart des cas il ne faut pas le faire et que ça ne sert à rien de faire comme ça plutôt que comme il faut, alors pourquoi le faire, et pourquoi le montrer ?

    Il s'agit d'enseigner le B.A.-BA de la programmation, quand une pratique est mauvaise, on ne l'enseigne pas et quand on la voit on dit qu'elle est mauvaise.

    Citation Envoyé par Sennad Voir le message
    Ps : Je pense qu'un modérateur doit savoir expliquer ces idées humblement, sans essayer de rabaisser les autres, mais en expliquant avec respect pourquoi ça solution est meilleure que la/les autre/s...
    Moi aussi. Mais il n'y a pas de question d'humilité là-dedans. Que mon alternative ne s'adapte pas à tout les coups, c'est possible, mais elle n'est pas mauvaise en soi. Ce que tu as montré, l'est. C'est mauvais dans la plupart des cas et ce n'est jamais meilleur que ce qui est bien. Donc c'est mauvais tout court.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre très actif Avatar de Sennad
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Août 2014
    Messages : 180
    Par défaut
    C'est fou comme les gens de nos jours montent sur leurs grands chevaux dès qu'ils ont quelque chose de meilleur qu'un autre.
    Je n’ai jamais dit que ta solution n’était pas bonne.
    Je n’ai jamais dit que ma solution était la meilleure.
    Alors pourquoi être agressif comme ça dès le premier post ? Tu es modérateur, tu n'es pas là pour montrer que tu sais plus que les autres, tu es là pour aider non ?
    Ya pas que celui qui pose une question qui a des choses à apprendre, y a également ceux qui répondent (toi y compris). Alors c'est sûr qu'on peut toujours trouvé mieux, mais ce n’est pas pour ça qu'il faut prendre les autres pour des mer...
    quand une pratique est mauvaise, on ne l'enseigne pas et quand on la voit on dit qu'elle est mauvaise.
    Bien sûr, sauf que tu as oublié un point essentiel.
    C'est bien beau de dire que la solution est mauvaise, regarde la mienne est meilleure, mais il faut également expliquer pourquoi l'autre solution est mauvaise.
    Tu as dit qu’il ne fallait pas fermer et rouvrir le fichier à chaque ligne, et tu as également dit que ce n'étais pas pour des questions de performances, alors explique nous, moi j'ai envie de savoir pourquoi ce que j'ai fait n’est pas bon, je n’ai pas envie qu'on me traite comme de la bouze alors que je propose de l'aide.

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

Discussions similaires

  1. Comment trouver une chaine de caractère dans fichier texte
    Par youssef1989 dans le forum Débuter
    Réponses: 3
    Dernier message: 01/05/2008, 16h45
  2. Réponses: 8
    Dernier message: 25/03/2008, 10h42
  3. rechercher une chaine de caractère dans un fichier
    Par 3FHFEB dans le forum Langage
    Réponses: 1
    Dernier message: 26/10/2006, 11h13
  4. Réponses: 9
    Dernier message: 07/09/2006, 13h47

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