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

  1. #21
    Membre à l'essai
    Merci beaucoup pour l'aide. Bon je galère tellement que je n'ai pas su adapter ta partie du programme au miens mais par contre j'ai tenté quelque chose sans savoir si ca fonctionnerait et il se trouve que oui, ça semblait pourtant logique mais bon j'y pensais pas!

    J'ai juste rajouté un second element dans ma partie extraction :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    if ( line.startsWith(word1)) { 
    	         System.out.println(line);
               }

    Le seul problème c'est qu'en sortie je n'ai la forme que je souhaite...

    Bout du resultat obtenu :
    LIN++38+98159916ZD:IN
    RFF+ON:87118685
    RFF+MH:6G2T0043
    RFF+MH:6G2T0065
    RFF+MH:6G2T0011
    RFF+MH:6G2T0012

    Les RFF doivent être sur la meme ligne que le LIN dont ils "dependent".

    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
    public static void main(String args[]) throws IOException {
     
    			System.out.println("Choix fichier :");
    			Scanner sc = new Scanner(System.in);
    			String fichier = sc.nextLine();
     
    			System.out.println("Saisissez une 1ere donnée :");
    			Scanner sc1 = new Scanner(System.in);
    			String donnee1 = sc1.nextLine();
    			final String word = donnee1;
     
    			System.out.println("2nd donnée à extraire : ");
    			Scanner sc2 = new Scanner(System.in);
    			String donnee2 = sc2.nextLine();
    			System.out.println("Extraction demandé :" +donnee1+ " / " +donnee2);
    			final String word1 = donnee2;				
     
    			sc.close();
    			sc1.close();
    			sc2.close();
     
    //-------------------------------------------------------------------------------------------------//
     
    				String pathToFile = "C:/Users/Desktop/Test/"+fichier+".txt";
    				Path path = Paths.get(pathToFile);
     
    				int nb = 0;
    				try(BufferedReader reader = Files.newBufferedReader(path)) {							// Lire le fichier et compter nb de ligne
    					for(String line = reader.readLine(); line!=null; line = reader.readLine()) {
    						nb++; 																			// on compte
    						if ( nb>1 ) break; 																// inutile de lire plus loin
     
    					}
    				}		 
     
    				try(BufferedReader reader = Files.newBufferedReader(path)) { 
    					for(String line = reader.readLine(); line!=null; line = reader.readLine()) {
    						if ( nb>1 ) { 																	// s'il y a plus d'une ligne on traite les lignes qui commencent par "word"
    							if ( line.startsWith(word1) ) { 												// si on commence par "word", on affiche ça
    								extraire(line);
    								System.out.println("Extraction");
    							}
    						}
     
    						else {
    							convertir(line, word, word1);
    						} 
    					}							 
    				}
    		}
     
    			private static void convertir(String file, String word, String word1) {
    				for(String line : file.split("'") ) { // on découpe par rapport à ', inutile de convertir en ligne pour parser des lignes (comme on a forcément qu'une ligne au plus, il n'y a aucun séparateur de ligne)
    					if ( line.startsWith(word)) {
    						System.out.println(line);
    					}
    					if ( line.startsWith(word1)) { 
    						System.out.println(line);
    					}
    				}
    			}
     
    			private static void extraire(String line) {
    				System.out.println(line);
     
    			}
    }



    Ma ligne commence à partir du 1er LIN et je dois donc extraire les RFF sans passer à la ligne, jusqu'au prochain LIN.
    Après il me restera à mettre en place une interface graphique qui est encore un autre problème ^^'

  2. ###raw>post.musername###
    Membre à l'essai
    Bonjour messieurs,

    Je viens vous demander de l'aide toujours à propos de mon programme d'extraction de données, le programme s'est développé une interface graphique et venu le completer. Aujourd'hui j'ai un problème d'extraction, je m'explique.
    Dans mon programme je dois créer une méthode avec parâmètres, cette methode a pour objectif d'offrir la posibilité à l'utilisateur de selectionner précisement le champ et composite d'une ligne à extraire.
    Voici un exemple de ligne -> LIN++38+98109282ZM:IN
    Les champs sont séparés par des " + " . Le champ qui m'interesse est le 4e (sachant que "LIN" fait parti du 1er champ, le 4e champ se trouve donc après le 3e "+" et concerne "98109282ZM").
    La longueur du 4e champs peut varier selon la ligne.
    Ce qui se trouve après les " : " est notre composite ( pas toujours présent ).

    Ma méthode doit donc :
    - Parcourir la ligne caractère par caractère
    - A la rencontre d'un " +" je dois incrementer un compteur
    - Lorsque la valeur de ce compteur est égale à la valeur donnée en parâmètre pour la selection du champs alors je dois extraire les caractères jusqu'a rencontrer un " : " ou " ' " ou " + " ( ":" ou " ' " ou "+" car la fin du 4e champs n'est pas forcement délimitée par " : " en fonction de la ligne!)
    - Une fois la fin du 4e champ repéré je dois extraire "composite" se trouvant juste derrière " : " . Si à la fin de mon 4e champs je retrouve " ' " ou " + " cela indique qu'il n'y a pas de composite et que je suis sur une nouvelle ligne et que je peux recommencer la manoeuvre avec la ligne suivante.

    Voici mon programme à l'instant T, je taff sur le sujet donc ma méthode ExtractValue est incomplete et fausse car je cherche encore comment faire d'ou ma demande sur ce forum
    1000 excuses pour vos yeux à la vue de mon programme bordelique je fais au mieux ^^
    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
     
    public class intergraph extends JFrame implements ActionListener{
     
    	static JButton validerbutton;										// Déclaration des boutons	
    	static JCheckBox choix;						
    	static JCheckBox choix2;	
    	static JTextArea jta;
    	static JScrollPane sp;
     
    	static String word;
    	static String word2;
    	static File fichier = null;
     
    	JPanel pano = new JPanel();
    	JPanel eastPano = new JPanel();
     
     
     
    	public intergraph(){		 							//-------------------INTERFACE GRAPHIQUE-------------------//
     
    		setSize(300, 150);	                                        // Définit sa taille : 400 pixels de large et 100 pixels de haut
    		setTitle("Data extraction");	                                // Définit un titre pour notre fenêtre
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                 // Termine le processus lorsqu'on clique sur la croix rouge	            
     
     
    		eastPano       = new JPanel();        
    		pano           = new JPanel();
    		jta            = new JTextArea();
     
    		jta.setEditable(false);
    		choix          = new JCheckBox("LIN+");							// Création des boutons
    		choix2         = new JCheckBox("RFF+");		
    		validerbutton  = new JButton("Valider");
     
    		pano.setLayout(new GridLayout(4,1));
    		eastPano.setLayout(new GridBagLayout());
     
    		choix.addActionListener(this);                                  // Mise en place de l'écoute des boutons 
    		choix2.addActionListener(this);
    		validerbutton.addActionListener(this);				 												
     
    		pano.add(choix);                                                // Ajout des boutons au JPanel
    		pano.add(choix2);
    		pano.add(validerbutton, BorderLayout.SOUTH);
     
    		add(pano);
    		add(eastPano, BorderLayout.EAST);
    		add(jta, BorderLayout.CENTER);
     
    		eastPano.add
    		(pano, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0,GridBagConstraints.NORTH,GridBagConstraints.NONE,new Insets(0, 0, 0, 0), 0, 0));
     
    		ouvertureExplo();
    		setVisible(true); 
     
    		jta.setLineWrap(true);
    	    	jta.setWrapStyleWord(true);
    	    	JScrollPane pane = new JScrollPane
    		(jta, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    		pane.setBounds(10, 10, 300, 100);
    		getContentPane().add(pane);
     
    	}
     
    	@Override	
    	public void actionPerformed(ActionEvent e) {           //----------------GESTION DES ACTIONS SUR LES BOUTONS------------------//
     
    		if (e.getSource()== choix){          // Si action sur "choix"
    			word = "LIN+";			         // Création de la variable "word" ou "LIN+" sera rangé
    			System.out.println(word);
    		}		
    										if (e.getSource()== choix2){        
    											word2 = "RFF+";          
    											System.out.println(word2);
    										}
     
    																		if (e.getSource()== validerbutton){
    																			String validation = "Validé";
    																			System.out.println("Extraction : "+word+" "+word2);
    																			try {
    																				extractionData();
    																			} catch (IOException e1) {
    																				e1.printStackTrace();
    																			  }
    																		}
    	}
     
    	public void ouvertureExplo(){
     
    		JFileChooser explorateur = new JFileChooser(new File("C:/Users/1cambien/Desktop/Test"));
     
    		if (explorateur.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { // si l'instruction showOpenDialog renvoie APPROVE_OPTION 
    			fichier = explorateur.getSelectedFile();
    		}
    	}
     
    	public void extractionData() throws IOException{           //----------------GESTION DES DONNEES------------------//
     
    		int nb = 0;
    		String pathToFile = ""+fichier;
    		Path path = Paths.get(pathToFile);
     
    		try(BufferedReader reader = Files.newBufferedReader(path)) {					// Lecture fichier
    			for(String line = reader.readLine(); line!=null; ) {
    				nb++; 	                                                                // Compteur nombre de ligne			
    				if ( nb>1 ); break;				 										// Inutile de lire plus loin
    			}
    		}		 
     
    		try(BufferedReader reader = Files.newBufferedReader(path)) { 	
    			for(String line = reader.readLine(); line!=null; line = reader.readLine()) {
    				if ( nb>1 ) { 															// si ligne > 1 on traite les lignes qui commencent par "word"
    					if ( line.startsWith(word) ) { 									// si on commence par "word", on affiche ça		
     
    						int field = 0;
    						int composite = 0;
    						//jta.append("\nPart N° : "+del+" ; ");
    						extractValue(line,field, composite);
    					}
    				}
     
    				else {
    					convertir(line, word, word2 );					
    				} 
    			}							 
    		}
    	}
     
    	private static void extractValue(String line, int field, int composite) throws IOException{
     
    		int cptplus = 0;
    		int i = 0;
     
    		for ( i = 0 ; i < line.length() ;i++){		   	
    			if(i == '+'){
    				cptplus++;
    				System.out.print(cptplus);
    			}
     
    			if (cptplus == field ){
    				line.charAt(i);
    					for (i = 0; i != '+'|| i != ':' || i!= '\'';i++){				
    						System.out.print(field);
    					}
    			} 
    		}
    	}
     
    	private static void convertir(String file, String word,String word2) throws IOException {
     
    		for(String line : file.split("'") ) { // on découpe par rapport à ', inutile de convertir en ligne pour parser des lignes (comme on a forcément qu'une ligne au plus, il n'y a aucun séparateur de ligne)
    			if(word!=null){	
    				if ( line.startsWith(word)) {     // Par defaut ceci concerne LIN
    					String del = line.substring(0,18);
    					jta.append("\nPart N° : "+del+" ; ");
     
    					int field = 0;
    					int composite = 0;
     
    					//jta.append("\nPart N° : "+del+" ; ");
    					extractValue(line,field, composite);
    			}
    		}		
    			if(word2!=null){			
    				if ( line.startsWith(word2+"MH")) {     // Par defaut ceci concerne RFF
     
    					jta.append(line+" ; ");
     
    					if(line.startsWith(word)){
    							jta.append("\n");		
    					}
    				}
    			}
    			if ( line.startsWith(word2+"ADE")) {     // Par defaut ceci concerne RFF	
    				jta.append("Supplier code : "+line+"\n");
    			}
    		}
    	}	
    }

    J'espère être clair !
    Merci d'avance pour le précieux temps accordé à mon problème !!
      0  0

  3. ###raw>post.musername###
    Modérateur
    Il te suffit d'écrire les règles dont tu parles et la solution vient naturellement.

    On doit parcourir les caractères pour trouver
    1. un début de champ
    2. une fin de champ

    Le début champ est déterminé par un comptage de + : ça tu l'as fait. La fin de champ n'est a déterminer que quand on a trouvé le début, et c'est un caractère particulier parmi une liste de caractères déterminés (":", "+" et "'").

    Donc on voit qu'il y a 2 phases différentes, pendant lesquelles on parcourt les caractères :
    1. une correspond au fait qu'on a trouvé un début de champ et qu'on cherche une fin
    2. l'autre qu'on cherche un début de champ


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private static void extractValue(String line, int field, int composite) throws IOException{
     
        int cptplus = 0;
     
        for ( int i = 0 ; i < line.length() ;i++) {
            if ( cptplus==field ) { // on a trouvé le début
            }
            else { // on cherche le début
            }		   	
         }
    }


    Le else, tu l'a déjà écrit, presque correctement :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(i == '+'){
    				cptplus++;
    				System.out.print(cptplus);
    			}

    Sauf que là, toi tu compares l'indice de parcourt (i) avec +, ce qui est illogique : i est un entier qui varie de 0 à fin de line, alors que + est un caractère. Autrement dit tu compares deux trucs qui n'ont rien à voir. C'est le caractère dans line à l'indice de parcourt qu'il faut comparer, tout simplement :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    private static void extractValue(String line, int field, int composite) throws IOException{
     
        int cptplus = 0;
     
        for ( int i = 0 ; i < line.length() ;i++) {
            if ( cptplus==field ) { // on a trouvé le début
            }
            else { // on cherche le début
                 if ( line.charAt(i)=='+' ) { // si le caractère à la position i est +, on le compte
                      cptplus++;
                 }
            }		   	
         }
    }


    et donc maintenant, tout simplement on ajoute la condition de fin de champ :

    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
    private static void extractValue(String line, int field, int composite) throws IOException{
     
        int cptplus = 0;
     
        for ( int i = 0 ; i < line.length() ;i++) {
             char c=line.charAt(i);
            if ( cptplus==field ) { // on a trouvé le début
                if ( c=='+' || c==':' || c=='\'' ) {
                        // on a trouvé ce qu'on cherche
                        break; // on peut arrêter de parcourir, c'est toujours ça de gagner sur le temps d'exécution
                }
            }
            else { // on cherche le début
                 if ( c=='+' ) { // si le caractère à la position i est +, on le compte
                      cptplus++;
                 }
            }		   	
         }
    }


    Maintenant, on veut afficher, ou extraire, quelque chose : si j'ai bien compris, c'est tout ce qui se trouve après le caractère ':' de fin de champ, donc à partir de la position du ':' + 1 :

    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
    private static void extractValue(String line, int field, int composite) throws IOException{
     
        int cptplus = 0;
     
        for ( int i = 0 ; i < line.length() ;i++) {
             char c=line.charAt(i);
            if ( cptplus==field ) { // on a trouvé le début, on cherche la fin
                if ( c==':' ) {
                        // on a trouvé ce qu'on cherche et on veut l'afficher
                       System.out.println("Composite : " + line.subtring( i+1 ) ); // ce qu'on veut afficher, c'est ce qui se trouve après le :, donc à partir de la position i+1
                        break; // on peut arrêter de parcourir, c'est toujours ça de gagné sur le temps d'exécution
                }
                else if ( c=='+' || c=='\'' ) {
                        // on a trouvé ce qu'on cherche, mais ça ne nous intéresse pas
                        break; // on peut arrêter de parcourir, c'est toujours ça de gagné sur le temps d'exécution
                }
            }
            else { // on cherche le début
                 if ( c=='+' ) { // si le caractère à la position i est +, on le compte
                      cptplus++;
                 }
            }		   	
         }
    }


    En revanche, je ne sais pas à quoi sert ton paramètre composite...
      0  0

  4. #24
    Membre à l'essai
    Merci Joêl pour la reponse rapide et les explications par rapport à mes betises.
    Je comprends très bien le principe de la methode j'en ai fait un algo pour poser les choses mais pas moyen de l'appliquer je m'embrouille ^^'

    Le parametre "composite" représente ce que l'on peut retouver après notre 4e champs derriere les " : " ceci dit il n'est pas obligatoirement présent en fonction des lignes que l'on rencontre.
    En gros mon but est d'extraire le 4e champs et le composite derrière les " : " (si il s'y trouve).

    Je vais analyser et essayer tout ça et je te tiens au courant du résultat ! Encore merci!

    Pardon j'ai pas precisé qu'il pouvait y avoir plusieurs composites d'ou l'utilité de ce parametre...! Pouvoir selectionner le composite voulu!

  5. ###raw>post.musername###
    Membre à l'essai
    Fonctionne parfaitement en tout cas merci pour le coup de main
    Voici le code au cas ou...
    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
    private static void extractValue(String line, int field, int composite) throws IOException{ //----------------SELECTION CHAMP & COMPOSITE--------------//
     
    	int i=0;
    	int cptplus = 0;				
    	char first = line.charAt(i);	
    	jta.append("\n"+" Part n° : ");
     
    		while (i < line.length()){	
    			first = line.charAt(i);
    			i++;	
     
    			if(first == '+'){
    				cptplus++;
     
    				while (cptplus >= field--){
    					first = line.charAt(i);
    					jta.append(""+line.charAt(i));
    					i++;
     
    					if ( first == '+' || first == '\'' || first == ':'){	
    						break;			
    					}
    				}
    			}
    		}		
    	}
      0  0

  6. #26
    Membre à l'essai
    Hello hello!

    De retour sur mon 1er programme d'extraction de donnée je me retrouve face à un problème qui me fatigue..
    Je cherche à exporter le contenu d'une JTextArea vers un fichier (.csv ou .txt c'est pareil) .
    Je recupère donc le contenu de ma JTextArea en faisant un simple
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
     jta.getText();
    puis l'exporte vers mon fichier, le problème est que lorsque l'exportation est trop volumineuse mon .csv est totalement vide.. Ca passe si l'exportation est inférieur à ~60ko.
    La plupart du temps l'exportation sera plus volumineuse que ça.
    Du coup j'arrive à récuperer le contenu de ma JTextArea, j'arrive à écrire dans un fichier sauf si volume > 50ko/60ko, et bloque sur cette étape.
    Voici la méthode concernant l'écriture dans le fichier :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private static void ecrire(JTextArea jta) {			
    	try {
    		DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(new File(sauvegardeExplo()))));
    		dos.writeUTF(jta.getText());
    		//System.out.println("LINE ->> "+line);
    		dos.close();
    	}
    	catch (java.io.IOException e) {e.printStackTrace();}		
    	}

    Merci d'avance pour votre temps messieurs!

  7. #27
    Modérateur

    N'utilise pas de DataOutputSteam pour faire un csv. Un CSV est un fichier texte, avec des lignes de données séparées par des virgules (je suppose que c'est le format que tu as généré dans le JTextArea). DataOutputStream permet de créer des fichiers binaires structurés de données. En l'occurence, un chaîne écrite avec writeUTF est précédée de sa taille, et cette taille étant un short, un nombre sur 16 bits, sa taille maximum est de 64K.
    Ensuite, il faut toujours fermer un fichier, y compris en cas d'exception (ce qui n'est pas le cas dans ton code).

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(sauvegardeExplo()), StandardCharsets.UTF_8)) {
       writer.write(jta.getText());
    } catch (java.io.IOException e) {
       e.printStackTrace();
    }

    *ici, avec la structure try-with-resource, le close est implicite, pas la peine de l'écrire et de compliquer le code pour gérer le cas du close en cas d'erreur.
    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.

  8. #28
    Membre à l'essai
    J'avais pensé au fait que, peut être le DataOutputStream me limite, mais j'avais pas trouvé d'info précisant le 64k. J'ai du passer à côté ou pas assez cherché..
    Pour la énième fois ta solution me sort du pétrin, enorme merci pour ton attention Joel!

  9. #29
    Membre à l'essai
    Bonjour

    Je reviens vers vous concernant un problème que j'ai deja abordé sur ce même sujet mais de la mauvaise manière et il se trouve que certaines choses ont changés.
    Cela concernait l'extraction des champs et composites se trouvant dans un segment.

    Le format standard d'un segment est le suivant :
    'LIN + 1082 + 1229 + 7140 : 7143 : 1131 : 3055 + 5495 : 1082 + 1222 + 7083'

    (Les valeurs 1082, 1229, 7140, 7143 etc.. ne représentent rien d'important ce sont simplement les refs des valeurs pouvant s'y trouver.)

    Un segment est délimité par les " ' ", il se compose de champs et les champs se composent donc de "composites".
    Les champs sont délimités pas les " + " et les composites à l'interieur des champs par des " : "

    Ma méthode doit permettre de choisir quels champ et composite je souhaite extraire.
    Par exemple champ 4 composite 2 me donnera -> 7143

    Ma méthode prend donc 3 parametres (line, field, composite).

    J'ai beaucoup de mal à mettre ça en place je tourne en rond et n'obtient jamais le resultat souhaité..
    (Joel tu m'avais déjà donné une méthode pour mon 1er post sur ce problème, j'ai essayé de l'adpater à mes besoins mais pas moyen après plusieurs heures de recherche.. donc je redemande un coup de main et en profite pour mieux formuler ma demande ).

    Merci d'avance pour votre aide !

  10. ###raw>post.musername###
    Membre à l'essai
    Voici ma méthode à l'heure actuelle mais le resultat obtenu n'est pas bon, l'extraction se fait bien à partir du champ et du composite voulu mais jusqu'a la fin du segment et non jusqu'au prochain " + " ou " ' " ou " : ", normalement la ou l'extraction doit s'arrêter.

    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
    	private static void extractValue(String line, int field, int composite) throws IOException{ //----------------SELECTION CHAMP & COMPOSITE--------------//
     
    		int cptplus = 0;
    		int cptpoint = 0;
    		jta.append("\n");
    		jta.append("Part n ; ");		
     
    		for ( int i = 0 ; i < line.length() ;i++) {
    			char c=line.charAt(i);
     
    			if ( c == '+' )cptplus++;
    			if ( c == ':' )cptpoint++;																	 
     
    			if (cptplus == field-1){
    				//System.out.println("cptplus : "+cptplus);
    				if(cptpoint == composite-1){
    					//System.out.println("cptpoint : "+cptpoint);
    					System.out.print("\n"+line.substring( i+1 ));					
     
    					if ( c == ':' || c =='\'' || c == '+'){
     
    						break;
    					}					
    				}
    			}
    		}
    	}
      0  0

  11. ###raw>post.musername###
    Modérateur
    Déjà, il faudrait réinitialiser le compteur de composite chaque fois qu'on rencontre un + (pour qu'on est un compteur par champ, indépendant du nombre de composites dans les champs précédents, ce qui serait ingérable).

    Ensuite, lorsque le bon composite est trouvé, dans le bon champ, il faut chercher le séparateur suivant pour obtenir la fin du champ (alors que dans ton code tu sors direct dans le test.

    Sinon, au lieu de faire un automate à état, tu peux utiliser des splits et un peu de traitement (trim) :

    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
    public static String getComposite(String s, int field, int composite) {
     
    		s = s.trim();
    		s = s.substring(1,s.length()-2); // pour enlever les quotes.
     
                    field++; // on élimine le premier champ qui est un nom (LIN)
     
    		final String[] fields = Arrays.stream(s.split("\\+")).map(String::trim).toArray(String[]::new); // découpe la chaîne selon les + en virant les espaces superflues
    		if ( field<fields.length ) {
    			final String[] composites = Arrays.stream(fields[field].split(":")).map(String::trim).toArray(String[]::new); // découpe la chaîne selon les : en virant les espaces superflues
    			if ( composite<composites.length ) {
    				return composites[composite];
    			}
    			else {
    				throw new NoSuchElementException("Composite " + composite + " not found in field "+field);
    			}
    		}
    		else {
    			throw new NoSuchElementException("Field "+field+" not found");
    		}
     
    	}
      0  0

  12. #32
    Membre à l'essai
    Avant tout merci Joel pour ta reponse rapide.

    Cette méthode est très complexe ( pour moi )
    J'aimerais bien faire fonctionner ma petite methode quand meme avant de prendre ton code que malheureusement je comprend qu'à 20% pour le moment ^^'

    Mon dernier souci est que l'extraction ne s'arrête pas à la rencontre d'un des caractères de fin de champ,composite ou segment c'est à dire " + " , " : ", " ' ".
    Pourrais tu me dire si tu vois ce qui peut causer ce problème dans ma méthode ?
    Voila ce que j'ai en sortie quand je demande le champ 5 composite 2.

    Je devrais uniquement avoir le 1082 en sortie... alors que la j'ai toute la fin du segment

    Je vais essayer de saisir tout ce qu'il se passe dans ton code car la méthode doit être bien optimisée ca me servira d'exemple pour la suite !

    ps : j'ai oublié de préciser que j'ai fait en sorte que mon cptpoint soit reinitialisé a chaque nouveau champ comme tu as dit!

  13. ###raw>post.musername###
    Modérateur
    Citation Envoyé par Danoob80 Voir le message

    Cette méthode est très complexe ( pour moi )
    Au contraire, je dirais qu'elle est 100 fois plus simple que celle que tu essayes de mettre en place. Ne pas connaitre une classe/méthode du JDK ne rend pas plus complexe un algorihtme. C'est simplement que tu ne connaissais pas la méthode split de String, méthode très utile au deumeurant : un petit tour de 1 minute dans la doc et tu comprendras les 80 % qui te manque.


    Citation Envoyé par Danoob80 Voir le message

    Mon dernier souci est que l'extraction ne s'arrête pas à la rencontre d'un des caractères de fin de champ,composite ou segment c'est à dire " + " , " : ", " ' ".
    Pourrais tu me dire si tu vois ce qui peut causer ce problème dans ma méthode ?
    J'ai (déjà) répondu à cette question :
    Citation Envoyé par joel.drigo Voir le message

    Ensuite, lorsque le bon composite est trouvé, dans le bon champ, il faut chercher le séparateur suivant pour obtenir la fin du champ (alors que dans ton code tu sors direct dans le test.
    C'est le mot suivant qui est important !

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    if (cptplus == field-1){
     
        if(cptpoint == composite-1){
     
            // ici tu as trouvé le début du champ... il faut donc continuer d'avancer dans la chaîne jusqu'à trouver soit une fin de composite (un <img src="images/smilies/icon_smile.gif" border="0" alt="" title=":)" class="inlineimg" /> soit une fin de champ (un +), soit la fin de la section (un '), soit la fin de la chaîne (ce qui voudrais dire qu'il y a une erreur dans le fichier).	Il faut bien sûr mémoriser la position de départ (i). NB: on n'était pas obligé dans le premier exemple que je t'ai donné, parce qu'on cherchait le début et que la fin était forcément la fin de la chaîne				
     
            if ( c == ':' || c =='\'' || c == '+'){
     
                break; // le break ici termine la boucle, alors qu'on est forcément sur le caractère qui correspond au séparateur avant le début du composite, donc forcément tu ne trouve que le début du champ
           }					
       }
    }


    D'une part, quand (cptpoint == composite-1), mémoriser i (dans une autre variable, start par exemple, qu'on initialiserait à -1)
    Tu as donc deux solutions :

    • soit, toujours, dans le if, faire une nouvelle boucle à partir de i+1 , pour chercher la fin (donc un while au lieu du if)
    • soit virer le test if ( c == ':' || c =='\'' || c == '+'), laisser le break, mémoriser le i, et faire une seconde boucle si start!=-1, pour chercher la fin.
      1  0

  14. #34
    Membre à l'essai
    Bonjour Joel !

    Merci beaucoup pour ta réponse je me suis penché sur ta methode je la comprend (pas totalement) mais elle fonctionne à merveille en tout cas !
    Par contre une chose que je comprend pas c'est comment ta methode fait-elle le lien entre les 2 tableaux ?
    Comment sait elle sans compteur qu'on se trouve dans composite 2, champ 4 ?
    Sans compteur je vois pas comment tu procèdes ^^ Desolé si les questions te semble un peu bête mais je vois pas

  15. ###raw>post.musername###
    Modérateur
    Prenons ta chaîne exemple : s = "'LIN + 1082 + 1229 + 7140 : 7143 : 1131 : 3055 + 5495 : 1082 + 1222 + 7083'"

    On fait :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    s = s.trim();
    s = s.substring(1,s.length()-2); // pour enlever les quotes.

    On vire les espaces éventuels au début et à la fin, pour être sûr que la seconde ligne de code prenne les caractères entre le premier et l'avant-dernier,
    ce qui nous donne : s = "LIN + 1082 + 1229 + 7140 : 7143 : 1131 : 3055 + 5495 : 1082 + 1222 + 7083" (on à enlevé les quotes).

    Ensuite, on divise cette chaîne en morceau séparé par + : s.split("\\+") (on a besoin de mettre \\ devant + parce que split prend des expressions régulières en paramètre qui décrivent des motifs de caractères et que le + a une signification dans ces motifs (donc on l'échappe comme on échappe un " dans une chaîne normale). Un split donne un tableau en retour avec chaque morceau.
    Donc découpée, la chaîne donne ces morceaux :
    • "LIN "
    • " 1082 "
    • " 1229 "
    • " 7140 : 7143 : 1131 : 3055 "
    • " 5495 : 1082 "
    • " 1222 "
    • " 7083"

    Donc je fais juste une manip pour virer les espaces :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    final String[] fields = Arrays.stream(s.split("\\+")).map(String::trim).toArray(String[]::new); // découpe la chaîne selon les + en virant les espaces superflues

    Puis je teste si le numéro du field est bien dans le tableau (il y a un petite erreur là : je n'ai pas géré le fait que le premier morceau contient "LIN" : il faudrait décaler de 1.
    si le field existe (si le numéro correspond à une case de tableau), alors on découpe la chaîne dans cette case par des ":"
    Il n'y a pas besoin de compteur, puisqu'avec un tableau, on peut accèder à n'importe quelle case directement par son index.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    final String[] composites = Arrays.stream(fields[field].split(":")).map(String::trim).toArray(String[]::new); // découpe la chaîne selon les : en virant les espaces superflues

    Donc, on recommence le même genre de traitement : on obtient un tableau de morceaux, et on compare avec le numéro de composite.
      1  0

  16. #36
    Membre à l'essai
    Bonjour bonjour !

    Merci beaucoup pour tes explications claires et précises Joel

    D'accord la valeur que l'on aura pour composite ou field correspondra à son emplacement dans le tableau quoi!
    Parfait tout roule de mon coté ! Reste à gerer les erreurs pour qu'elles n'arrêtent pas mon programme

  17. #37
    Modérateur

    Citation Envoyé par Danoob80 Voir le message

    D'accord la valeur que l'on aura pour composite ou field correspondra à son emplacement dans le tableau quoi!
    Exactement.
    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.