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

Logging Java Discussion :

Interpréter un fichier log en Java


Sujet :

Logging Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2012
    Messages : 26
    Points : 10
    Points
    10
    Par défaut Interpréter un fichier log en Java
    Bonjour à tous,

    Je souhaiterais récupérer certains champs dans un fichier log qui ressemble à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    2012-06-07*06:25:30*1ScUGn-0002IB-7j*<=*hom@bd.missions-acf.org*H=(ACFJ4YGMQ1)*[182.160.106.74]*P=esmtpa*A=fixed_login:hom@bd.missions-acf.org*S=4591657*id=005301cd4465$6af85e20$40e91a60$@bd.missions-acf.org
    2012-06-07*06:25:33*1ScUHt-0002Tn-7k*<=*hom@bd.missions-acf.org*H=localhost*[127.0.0.1]*P=esmtp*S=4592070*id=005301cd4465$6af85e20$40e91a60$@bd.missions-acf.org
    2012-06-07*06:25:33*1ScUGn-0002IB-7j*=>*fscoordo@bd.missions-acf.org*R=amavis_router*T=amavis*H=srv1.missions-acf.org*[127.0.0.1]
    2012-06-07*06:25:33*1ScUGn-0002IB-7j*->*homassist@bd.missions-acf.org*R=amavis_router*T=amavis*H=srv1.missions-acf.org*[127.0.0.1]
    2012-06-07*06:25:33*1ScUHt-0002Tn-7k*=>*fscoordo*<fscoordo@bd.missions-acf.org>*R=virtual_localuser*T=virtual_localdelivery
    2012-06-07*06:25:33*1ScUHt-0002Tn-7k*=>*fscoordo*<fscoordo@bd.missions-acf.org>*R=user_vacation*T=vacation_reply
    2012-06-07*06:25:33*1ScUHt-0002Tn-7k*=>*homassist*<homassist@bd.missions-acf.org>*R=virtual_localuser*T=virtual_localdelivery
    2012-06-07*06:25:33*1ScUHt-0002Tn-7k*Completed
    Je voudrais récupérer uniquement les adresses mails en fonction du troisième champ qui correspond à un mail donné.
    Pour le moment j'arrive à récupérer tous les champs du fichier et les séparé par des ; afin de les écrire dans un CSV. La ou je bloque, c'est que je souhaiterai récupérer les adresses mails derrière les "=>", "->" et "<=" en fonction du 3éme champ (exemple: 1ScUHt-0002Tn-7k).

    Pourriez-vous m'aider ?

    D'avance merci.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Et bien, qu'est-ce qui te coince, si tu as d"éjà récupéré

    A=fixed_login:hom@bd.missions-acf.org

    ça ne devrait pas être bien dur de séparé la gauche et la droite du = comme tu l'ava fait avec les ;

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2012
    Messages : 26
    Points : 10
    Points
    10
    Par défaut
    Alors, le problème est que je récupère tout.
    Or, je souhaiterai uniquement récupérer les adresses emails comme décrit dans mon précédent post.

    En gros couper tout ce qui m'est inutile. Mais, récupérer les adresses en les triant par le champ 3.
    Je ne sais pas si ce que je dis est assez clair.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    le problème, c'est surtout qu'on ne vois pas sur quoi tu coince. Tu nous dit que tu arrive à séparer les différent champs, donc ca ne dois pas être un problème de regarder le champ numéro 3 et de te dire "ca c'est l'adresse email"

    Concrètement, qu'est-ce que tu as pour le moment?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2012
    Messages : 26
    Points : 10
    Points
    10
    Par défaut
    Et bien justement, comment dire ce qu'il y a dans le 3ème champs.
    C'est ça que je ne sais pas faire je vois pas comment dire champ n°x => tu fais ça.

    En gros, je ne sais pas comment trier un fichier csv en fontion des champs.

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ce fichier n'a rien à voir avec du csv. Donne nous déjà ton code de lecture qu'on vois où t'es arrivé. Et pointe nous précisément dans ce fichier ce que tu veux extraire comme données.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2012
    Messages : 26
    Points : 10
    Points
    10
    Par défaut
    Ok je recommence depuis le début.

    J'ai un fichier de log comportant plus de 50000 lignes : (en rouge ce qui m’intéresse tout le reste est futile)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    2012-06-07 06:25:30 1ScUGn-0002IB-7j <= hom@bd.missions-acf.org H=(ACFJ4YGMQ1) [182.160.106.74] P=esmtpa A=fixed_login:hom@bd.missions-acf.org S=4591657 id=005301cd4465$6af85e20$40e91a60$@bd.missions-acf.org
    2012-06-07 06:25:33 1ScUHt-0002Tn-7k <= hom@bd.missions-acf.org H=localhost [127.0.0.1] P=esmtp S=4592070 id=005301cd4465$6af85e20$40e91a60$@bd.missions-acf.org
    2012-06-07 06:25:33 1ScUGn-0002IB-7j => fscoordo@bd.missions-acf.org R=amavis_router T=amavis H=srv1.missions-acf.org [127.0.0.1]
    2012-06-07 06:25:33 1ScUGn-0002IB-7j -> homassist@bd.missions-acf.org R=amavis_router T=amavis H=srv1.missions-acf.org [127.0.0.1]
    2012-06-07 06:25:33 1ScUHt-0002Tn-7k => fscoordo <fscoordo@bd.missions-acf.org> R=virtual_localuser T=virtual_localdelivery
    2012-06-07 06:25:33 1ScUHt-0002Tn-7k => fscoordo <fscoordo@bd.missions-acf.org> R=user_vacation T=vacation_reply
    2012-06-07 06:25:33 1ScUHt-0002Tn-7k => homassist <homassist@bd.missions-acf.org> R=virtual_localuser T=virtual_localdelivery
    2012-06-07 06:25:33 1ScUHt-0002Tn-7k Completed
    2012-06-07 06:25:34 H=localhost (webmail.missions-acf.org) [127.0.0.1] F=<logco@np.missions-acf.org> rejected RCPT <adminfinanceassist@np.missions-acf.org>: Unrouteable address
    Je souhaiterais dans un premier temps, trier mon fichier en fonction du mail grâce au 3ème champ (ex:1ScUGn-0002IB-7j ).

    Voila ce que j'ai pour le moment :
    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
    public class ReadFiletest {
     
    	public static void main (String args[]) {
     
    		try{
    			//On instancie et déclare nos objets. 
    			DataInputStream dis = new DataInputStream (new FileInputStream ("exim_mainlog")); 
    			  byte[] datainBytes = new byte[dis.available()]; 
    			   dis.readFully(datainBytes); //lecture du fichier texte dans sa totalité
     
    			    String content = new String(datainBytes, 0, datainBytes.length); //on stocke le fichier lu dans une variable
    			     content = content.replaceAll(" ",";");			    
     
    			     CSVWriter writer = new CSVWriter(new FileWriter("TEST2.csv"), '\n');
    			     String[] entries = content.split("\n");
    			     writer.writeNext(entries);
    				writer.close();
     
     
    			        dis.close(); 
    		} catch(Exception ex){
    			ex.printStackTrace();
    		  }
     
    	}
    }
    J'ai donc à l'arrivée un fichier csv avec dans chaque première case une ligne entière de mon fichier log. (j'ai fait comme ça car je pense que c'est le plus simple pour ensuite repérer ce qui m'intéresse)
    Ce que je voudrais faire c'est pouvoir dans un 1er temps, classer.
    Ensuite récupérer les adresses mails en fonction des flèches ("<=" expéditeur, "->","=>" destinataires).
    Si je n'est pas été suffisamment claire n'hésitez pas à me demander des précisions.
    Le but finale étant de pouvoir donner un fichier de log comme celui de l'exemple et qu'il m'extrait les données dont j'ai besoin.

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 125
    Points : 98
    Points
    98
    Par défaut
    Salut,

    Je te propose de lire le fichier ligne par ligne, voir Byte par Byte et traiter tes cas dès la lecture.

    Tu stockes ce que tu lis dans un tableau, ou une map à toi de voir, jusqu'à rencontrer un espace, là tu remplis le 2e champ du tableau.

    Vu que le fichier a toujours la même forme (ou presque) tu pourras lire ton tableau en disant:
    tab[1] = date
    tab[2] = heure
    tab[3] = truc bizarre à traiter comme tu veux
    tab[4] : if ("=>") alors destinataire ...

    tab[5] :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (! tab[5].contains("@")) //ne rien faire et traiter tab[6]
    {
     String email = tab[6]; //il faut aussi supprimer les '<' si il y en a
    }
    else String email = tab[5];
    A vérifier aussi si tes champs 4 et 5 existent à chaque fois.


    Lire byte par byte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    long taille = f.length(); //f = ton fichier
    FileInputStream fis = new FileInputStream(f);
    BufferedInputStream bis = new BufferedInputStream(fis);
     
    for (long cpt = 0; cpt < taille; cpt++)
    {
    	c=(char)bis.read();
    	if( Character.toString(c).equals(" "))
    	//(...)
    }
    A chaque fois que tu obtiens un truc interessant tu stockes etc..

    Vu que je ne suis pas non plus certain d'avoir tout compris au problème, j'espère que c'est utile.
    Il existe aussi probablement des moyens plus simples d'y arriver.. mais là tu pourras en gérant tes cas toi même

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ce n'est pas aussi simple, tu ne peux pas considérer tous les espace comme des séparateurs. de plus datainputstream est loin d'être approprié, (pour lire des byte, inputstream est suffisant).

    Ce que je te recommande c'est de créer un BufferedFileReader (pour lire ligne par ligne) et ensuite, pour chaque ligne, faire un split

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String[] premierElements = ligne.split(" (?!<)");
    Ceci coupe sur tous les espaces non suivis de "<", ce qui devrais préserver ton email sous la forme d'une seule chaine

    Tu aura alors en 0,1 et 2 la date, l'heure et l'id
    en 3 la direction
    en 4 l'email complet
    en 5,6,7,... les paramètres.

    Pour ce qui est du S=.... il faudra parcourir ces paramètres supplémentaires pour en repérer un qui commence par "S="


    Bien sur ça suppose que tu n'a pas d'entrée plus tordu du style
    Monsieur tartempion<tartempion@gmail.com>

  10. #10
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 125
    Points : 98
    Points
    98
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    ce n'est pas aussi simple, tu ne peux pas considérer tous les espace comme des séparateurs.
    (...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String[] premierElements = ligne.split(" (?!<)");
    lol? ^^
    De toute façon je ne suis pas sûr qu'il y ait un autre moyen, à moins de s'arracher les cheveux.

    tchize_ t'as donné le "probable moyen plus simple d'y arriver" qui t'évite de construire toi même le tableau :p.

    Le byte/byte c'est bien si t'as des cas particuliers, mais à priori si le fichier est construit tout le temps pareil il a raison c'est unitile.

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2012
    Messages : 26
    Points : 10
    Points
    10
    Par défaut
    Merci à tout les 2 pour vos retours.
    En effet, l'utilisation de "FileInputStream" est suffisante pour ce que je souhaite faire. Par contre, comme mon niveau de JAVA est vraiment faible j'ai du mal à construire mon tableau.

    Avec vos conseils je suis arrivé à ça :
    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
    try{
    			String f = "exim_mainlog";
    			long taille = f.length(); //f = ton fichier
    			FileInputStream fis = new FileInputStream(f);
    			BufferedInputStream bis = new BufferedInputStream(fis);
    			System.out.println(f);
    			for (long cpt = 0; cpt < taille; cpt++)
    			{
    				char c = (char)bis.read();
    				if( Character.toString(c).equals(" ")){
    				String[] tab = new String[c];
    				System.out.println(tab[0]);
    				}
    			}
     
    			        bis.close();
    			}
    Le problème est que je dois très certainement mal m'y prendre et du coup le println de mon tab 0 me retourne null..

    Par contre je pense que je suis obligé d'utiliser un tableau à 2 dimensions.
    Car il faut absolument que je récupère le champ 3 de chaque ligne pour les trier. Du fait que les adresses email à récupérer dépendent du "n° de session" (champ 3).

  12. #12
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 125
    Points : 98
    Points
    98
    Par défaut
    Oula. ok.
    Bon si tu souhaites malgré tout "t'amuser" avec ma méthode.

    Déjà un
    File f = new File(fic);
    à la place de ton String f ça aiderait mieux.

    Ensuite ceci est une fonction qui lit bêtement un fichier et retourne son contenu:

    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
    public String lireFichier(String fic) throws FileNotFoundException
    {
    	String contenu="";
     
    	File f = new File(fic);
    	if(f.exists())
    	{
    		try {
    		long taille = f.length();
    		FileInputStream fis = new FileInputStream(f);
    		BufferedInputStream bis = new BufferedInputStream(fis);
     
    		for (long cpt = 0; cpt < taille; cpt++)
    			contenu+=(char)bis.read();
     
    		return contenu;
    		} 
     
    		catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    	throw new FileNotFoundException();
    }
    Tu pourras tester si tu arrives à lire ton fichier, et si ca le lit correctement.

    Ensuite un début de piste pour l'interieur de ta boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //On crée les variables en dehors de la boucle :)
    String[] tableau = new String[6];
    char testCaractere;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for (long cpt = 0, i=0; cpt < taille ; cpt++){
    testCaractere=(char)bis.read(); //On récupere le caractere dans une variable pour ne faire appel qu'une seule fois à bis.read()
     
    if(Character.toString(testCaractere).equals(" ")){  // si on a un " " alors je stocke ce que j'ai enregistré jusque là dans mon tableau
    	tableau[(int)i]=contenu; 			//le cast en (int) c car j'ai du déclarer i en long
    	i++;
    	contenu=""; // on vide le contenu pour commencer à enregistrer la suite
    }
     
     else
    	contenu+=testCaractere;

    Maintenant attention, ca va lire tout le fichier donc pas s'arrêter à 5 blocs. Des que tu en as rencontré 5 il faut t'arrêter de stocker jusqu'à rencontrer une fin de ligne ( "\n")
    Enfin 5, ou c'est toi qui voit si il faut aller plus loin...
    Au final quand tu as rencontré un "\n" tu auras ton tableau[3] contenant ta session, et le reste dans les autres cases

    Yora plein de petits trucs auxquels il fat penser...



    L'autre solution consiste à utiliser la méthode readLine() jusqu'à rencontrer "null" et faire le .split(" (?!<)"); qu'a donné tchize_ sur chaque ligne.
    Ainsi tu auras un tableau tout fait pour une ligne.

    Essai comme ça, c'est plus approprié.
    Il te faut juste trouver comment marche readLine()

  13. #13
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2012
    Messages : 26
    Points : 10
    Points
    10
    Par défaut
    Merci beaucoup oni13!

    Bon ça commence à parler la

    Voici ou j'en suis :
    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
    try{
    			String f = "exim_mainlog";
    			String[][] tab = new String[600][600];
    			String champ = "";
    			long taille = new File(f).length();
    			FileInputStream fis = new FileInputStream(f);
    			BufferedInputStream bis = new BufferedInputStream(fis);
    			for (long cpt = 0; cpt < taille; cpt++)
    			{
    				int i = 0,j = 0;
    				char c = (char)bis.read();
    				champ += Character.toString(c);
    				if( Character.toString(c).equals(";")){
     
    					tab [i][j] = champ;
    					j++;
    					champ = "";
     
    				}
    				if( Character.toString(c).equals("\n")){
    					j=0;
    					i++;
    				}
    				System.out.println(cpt);
    				}
    			System.out.println(tab[0][2]);	
    			        bis.close();
    			}
    Bon par contre pour le moment j'ai uniquement un champ dans ma case 0.0 pas dans les autres mais on approche du but, mon compteur fonctionne bien.

    Je pense que mon pb viens du séparateur " "..

  14. #14
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    sérieusement drak08, abandonne ce bout de code que tu nous a montré, c'est une manière moche, lente, et fortement consommatrice de lire du csv. Hors pour lire du csv, en java, il y a déjà des librairies raisonnablement performantes toutes faites.

    http://thierry-leriche-dessirier.dev...csv-avec-java/


    Enfin,

    champ += Character.toString(c); <-- faire de la concaténation de string dans une boucle, c'est très peux performant => utiliser StringBuilder

    if( Character.toString(c).equals(";")) <-- convertir un char en String pour ensuite appeler sa méthode equals.... Ca veux dire que si ton fichier log fait 10M, tu va créer 10 millions d'objets en mémoire... Je te laisse imaginer les performance. Comparer directement des char te fera économiser 10 millions d'objets.


    char c = (char)bis.read(); <-- ça suppose que le fichier soit en us-ascii pour marcher (autant le savoir). Pour gérer correctement la lecture de fichier texte, utiliser un Reader

  15. #15
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2012
    Messages : 26
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    sérieusement drak08, abandonne ce bout de code que tu nous a montré, c'est une manière moche, lente, et fortement consommatrice de lire du csv. Hors pour lire du csv, en java, il y a déjà des librairies raisonnablement performantes toutes faites.
    La je lis directement mon fichier de log pas de csv.

    Citation Envoyé par tchize_ Voir le message
    if( Character.toString(c).equals(";")) <-- convertir un char en String pour ensuite appeler sa méthode equals.... Ca veux dire que si ton fichier log fait 10M, tu va créer 10 millions d'objets en mémoire... Je te laisse imaginer les performance. Comparer directement des char te fera économiser 10 millions d'objets.
    Tu me conseilles quoi ?


    Citation Envoyé par tchize_ Voir le message
    char c = (char)bis.read(); <-- ça suppose que le fichier soit en us-ascii pour marcher (autant le savoir). Pour gérer correctement la lecture de fichier texte, utiliser un Reader
    ok c'est donc pour ça que mon tableau me retourne null

    bon bah c'est reparti pour un tour

  16. #16
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par drac08 Voir le message
    La je lis directement mon fichier de log pas de csv.
    Le bout de code que tu as montré, c'est de la lecture csv (arrêt aux ; et chaque set sur une ligne)
    Tu me conseilles quoi ?
    Soit tu utilise une libiraire CSV si tu persiste à utiliser du csv, soit tu fait ce que je t'ais déjà dit dans un autre post... a savoir bufferedReader et, pour chaque ligne lue: elements = ligne.split(" (?!<)");

  17. #17
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2012
    Messages : 26
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Le bout de code que tu as montré, c'est de la lecture csv (arrêt aux ; et chaque set sur une ligne)
    oui j'ai fait ça car je pensais que mon séparateur actuel (" ") posait problème.

    Citation Envoyé par tchize_ Voir le message
    Soit tu utilise une libiraire CSV si tu persiste à utiliser du csv, soit tu fait ce que je t'ais déjà dit dans un autre post... a savoir bufferedReader et, pour chaque ligne lue: elements = ligne.split(" (?!<)");
    Oui au début j'étais parti sur du csv car je pensais qu'il existait des fonctions toutes faites pour trier mes champ mais je n'ai pas trouvé ça donc pas de csv.

    Comme j'ai besoin de trié TOUS mes champs 3 les uns avec les autres je pense que l'utilisation d'un tableau à 2 dimensions est inévitable. tu ne crois pas ?

  18. #18
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    une fois que tu as splité correctement ta ligne, tu en fais ce que tu veux hein. N'essaie pas de tout faire en même temps.

  19. #19
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2012
    Messages : 26
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    une fois que tu as splité correctement ta ligne, tu en fais ce que tu veux hein. N'essaie pas de tout faire en même temps.
    Ok, mais on est bien d'accord que l'idéal est d'utiliser une variable char afin de lire caractère par caractère afin de pouvoir slipter ma chaine en fonction des séparateur ?

    Tu me confirmes que pour effectuer un tri comme je l'ai expliqué je dois passer par un tableau 2D ?

  20. #20
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Non, je t'ai déjà donné un code qui fait le split en une seule ligne. Pourquoi refaire un travail que java c'est déjà faire (splitter sur base d'une expression régulière) ?

    Pour le Tri, tu peux utiliser des listes ou des tableaux, peu importe, il existe des méthodes de tri pour chacun des deux. L'idéal pour moi, ce serait qu'après avoir splitté ta ligne, tu fasse rentrer tes données dans un objet à toi (genre LigneDeLog) qui regroupe de manière lisible et facilement accessibles les données dont tu as besoin. Ensuite tu te fais une List<LigneDeLog> et tu la traite comme tu veux. C'est plus facile de travailler avec un objet dédié structurant tes données qu'avec un tableau dont il faut toujours compter pour savoir à quel index on doit aller.

Discussions similaires

  1. interprétations de donnée de fichier log
    Par devalender dans le forum Sécurité
    Réponses: 1
    Dernier message: 15/04/2013, 17h52
  2. Parser un flux XML (type fichier de log) en java
    Par zorglubpok dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 28/09/2009, 18h24
  3. fichier log java
    Par salim81 dans le forum Logging
    Réponses: 3
    Dernier message: 10/07/2007, 10h48

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