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 :

Scanner et Pattern


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Par défaut Scanner et Pattern
    Bonjour !

    Je souhaite récupérer des données d'un fichier d'entrée (*.dat, du texte). Cette démarche est identique aux outils Properties de Java. Néanmoins le fichier d'entrée n'est pas de la forme key=value, mais plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    c Key
    Value
     
    Key2
    Value2
    etc...
    J'ai d'abord orienté ma recherche sur la FAQ du site où j'ai découvert l'objet Scanner :
    Citation Envoyé par Comment lire un fichier ligne par ligne ?
    auteurs : sironimo, Baptiste Wicht
    String filePath = "g:\\fichier.txt";
    Scanner scanner=new Scanner(new File(filePath));
    while (scanner.hasNextLine()) {
    String line = scanner.nextLine();
    System.out.println(line)
    }
    scanner.close();

    De mon coté je ne souhaite pas l'afficher mais extraire les value de certains couples (key,value).
    La méthode que j'utilise se résume ainsi :
    1 - Initialisation des données :
    - Paramètre => File
    - String des key recherchées
    - Scanner et Matcher
    2 - Parcourir le fichier texte avec la méthode Scanner.hasNextLine()
    - Si la ligne courante correspond à une des key (sous forme Pattern),
    ça veut dire que la donnée est à la ligne suivante (cf. début du post)
    donc je stock cette ligne.
    - Sinon je teste si ça correspond à une autre des key recherchées.
    3 - Traitement supposé terminé, je scanner.close() et affiche les données stockées.

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    public class GetDatas 
    {
    	public static Pattern pLine, searchName, searchLongi, searchIniDate, searchS, searchCP,
    	searchDM, searchEM, searchXM;
    	public static Matcher m;
    	public static String newSN, newLN, newDN, newS, newCPN, newDMN, newEMN, newXMN;
     
    	public static void writeProps(String pathDat) throws IOException
    	{	
    		File srcFile = new File(pathDat);
    		Scanner scanner = new Scanner(srcFile);
    		String satName = "c Satellite Name"; 
    		String longiName = "c Satellite Longitude Positioning (in °E)"; 
    		String dateName = "c Initial Simulation Date (Year, Month, Day)"; 
    		String sName = "c Satellite cross sectional area (in m2)"; 
     
    		int nbLigne=0;
     
    		while(scanner.hasNextLine())
    		{
    			String line = scanner.nextLine();
    			nbLigne++;
    			pLine = Pattern.compile(line);
     
    			if(pLine.matcher(satName).matches())
    			{
    				newSN = scanner.nextLine();
    				System.out.println("Nom récupéré à la "+nbLigne+"-ème ligne");
    			}
    			else
    			{
    				if(pLine.matcher(longiName).matches())
    				{
    					newLN = scanner.nextLine();
    					System.out.println("Longitude récupérée à la "+nbLigne+"-ème ligne");
    				}
    				else
    				{
    					if(pLine.matcher(dateName).matches())
    					{
    						newDN = scanner.nextLine();
    						System.out.println("Date de simulation récupérée à la "+nbLigne+"-ème ligne");
    					}
    					else
    					{
    						if(pLine.matcher(sName).matches())
    						{
    							newS = scanner.nextLine();
    							System.out.println("Section m² récupérée à la "+nbLigne+"-ème ligne");
    						}
    					}
    				}
    			}
    		}
    		scanner.close();	
    		System.out.println("Nb Lignes : "+nbLigne+"\nNom : "+newSN+"\n"+"Longitude en °Est : "+newLN+"\n"+"Date initiale : "+newDN);
    	}

    Mon fichier d'entrée est celui ci :

    c Restart Filename
    c Autonomy Filename
    c Thruster Filename
    NILE101.th
    c Orbit Determination Filename
    NILE101.do
    c Strategy Filename
    NILE101.st2
    c Satellite Name
    NILE101
    c Satellite Longitude Positioning (in °E)
    35
    c Initial Simulation Date (Year, Month, Day)
    2010 06 15
    c Satellite cross sectional area (in m2)
    50.12
    Mais mon résultat (affiché ds la console) pose problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Nom récupéré à la 9-ème ligne
    Nb Lignes : 23
    Nom : NILE101
    Longitude en °Est : null
    Date initiale : null
    Je ne récupère que le nom et pas les autres paramètres alors que les Pattern et les key du fichiers sont censés matcher. Quelqu'un aurait une idée ?
    Je suis également à l'écoute de différentes approches si vous en avez !

    Merci par avance.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Par défaut
    En retirant les caractères "spéciaux" du fichier d'entrée comme les parenthèses, virgules et ° de degré, ça fonctionne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Longitude récupérée à la 10-ème ligne
    Date de simulation récupérée à la 11-ème ligne
    Section m² récupérée à la 12-ème ligne
    Nb Lignes : 20
    Nom : NILE101
    Longitude en °Est : -7
    Date initiale : 2010  06  15
    Néanmoins existe t-il une méthode pour que le scanner.nextLine() accepte de prendre en compte les caractères spéciaux ? Comment définir ces caractères ?

    Merci.

  3. #3
    Membre éclairé
    Homme Profil pro
    NoOb
    Inscrit en
    Mai 2007
    Messages
    554
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : NoOb

    Informations forums :
    Inscription : Mai 2007
    Messages : 554
    Par défaut
    Je pense pas que ce soit le scanner qui pose problème, j'ai fait la même chose avec un BufferedReader ca passe pas non plus, je pense surtout que c'est le matches qui passe pas.

    Ça marche très bien avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(line.equals(longiName))
    Sans le pattern, simple comparaison de String ...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Par défaut
    Oui en effet ça marche très bien avec le String.equals(String)

    "Pourquoi faire simple quand on peut faire compliqué"

    Merci pour ton aide !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/05/2011, 18h41
  2. Réponses: 0
    Dernier message: 08/03/2010, 12h45
  3. Réponses: 4
    Dernier message: 24/02/2009, 12h06
  4. Scanner des mails et récupérer le fichier attaché
    Par delphim dans le forum Composants VCL
    Réponses: 2
    Dernier message: 24/04/2003, 09h35
  5. [langage] expression reguliere motif répétitif dans 1 pattern
    Par comme de bien entendu dans le forum Langage
    Réponses: 11
    Dernier message: 09/04/2003, 16h14

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