StreamTokenizer et délimiteur

oncle jules Messages postés 43 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 19 septembre 2005 - 15 août 2005 à 18:02
cs_sammie Messages postés 9 Date d'inscription jeudi 18 août 2005 Statut Membre Dernière intervention 22 août 2005 - 19 août 2005 à 14:26
Salut à tous
je suis débutant en java. Je parse ce fichier avec la classe Streamtokenizer et j'aimerais mettre comme délimiteur le caractère '-', comme ça lorsqu'il tombe sur '-' il passe au token suivant en sachant que le signe '-' fait partie de ce dernier.
J'ai vu qu'il existe une classe StringTokenizer qui prend en compte l'ajout de délimiteur dans son constructeur, mais je préfèrerais utiliser streamtokenizer.
Merci pour votre aide

5 réponses

cs_sammie Messages postés 9 Date d'inscription jeudi 18 août 2005 Statut Membre Dernière intervention 22 août 2005
18 août 2005 à 10:04
POurquoi préférer le streamTokenizer alors que le Stringtokenizer est fait exprès ?
oncle jules Messages postés 43 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 19 septembre 2005
18 août 2005 à 11:51
Avec le StringTokenizer ca va etre plus embêtant à gérer étant donné la nature du fichier à parser.
C'est un fichier avec plein de lignes composées chacunes de 3 chiffres genre x.xxxxxxxxxE-xx ou xxxxxxxxE+xx
Ces 3 chiffres sont séparés par un espace si celui qui suit est positif. Si celui qui suit est négatif, le signe '-' vient se coller au chiffre précédent.
Donc tu comprends, si j'utilises le StringTokenizer avec Le signe - comme délimiteur, il va me couper des chiffres en plein dedans ..... :/
cs_sammie Messages postés 9 Date d'inscription jeudi 18 août 2005 Statut Membre Dernière intervention 22 août 2005
18 août 2005 à 12:01
Désolé, je ne comprend pas ce que tu veux faire.

Tu veux utiliser un Tokenizer pour rechercher les signes '-', sauf
quand il s'agit d'un '-' dans un nombre, type x.xxE-xx, c'est ca ?

Peux tu donner une exemple du fichier à traiter, et ceque tu souhaiterai en extraire ... ca faciliterait ma compréhension ;).
oncle jules Messages postés 43 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 19 septembre 2005
18 août 2005 à 23:38
Salut
Je te donne un exemple.
Voici un extrait du fichier que je dois parser.

0.0000000000000000E+00 0.4793504714965820E+01-0.3685846924781799E+00
0.4763874053955078E+01-0.3189862668514252E+00 0.4729751586914063E+01
-0.2703143358230591E+00 0.4559299945831299E+01-0.7672241926193237E+00
0.4537451267242432E+01-0.7189077734947205E+00 0.4514544963836670E+01
0.8216846734285355E-01-0.7416048526763916E+01-0.9867453575134277E-01
-0.7280107975006104E+01-0.2747862935066223E+00-0.7139624118804932E+01

C'est une succession de lignes composée pour chacune d'elles de 3 valeurs. Soit elles sont séparées par un espace, soit par un signe "moins" qui correspond au signe négatif de la valeur qui suit.

Je dois récupérer chacune de ces valeurs parce qu'il faut que je les réécrive dans un fichier. Mais je ne dois pas simplement faire un genre de copier-coller. Il faut que j'intervertisse les valeurs deux à deux.
Je prends l'exemple suivant : considérons les 6 lignes du dessus. Au final, je dois obtenir les 6 lignes suivantes:

0.4793504714965820E+01 0.0000000000000000E+00 0.4763874053955078E+01
-0.3685846924781799E+00 0.4729751586914063E+01-0.3189862668514252E+00
0.4559299945831299E+01-0.2703143358230591E+00 0.4537451267242432E+01
-0.7672241926193237E+00 0.4514544963836670E+01-0.7189077734947205E+00
-0.7416048526763916E+01 0.8216846734285355E-01-0.7280107975006104E+01
-0.9867453575134277E-01-0.7139624118804932E+01-0.2747862935066223E+00

Mon idée est de stocker les 6 valeurs contenues dans deux lignes dans un String pour simplifier l'écriture, et de faire une boucle jusqu'à la fin du flux. Travailler avec les indices semble la solution la plus simple. Je récupère les 6 valeurs avec StringTokenizer mais le problème vient des délimiteurs. Dans mon cas, l'espace et le signe "moins" sont des délimiteurs; mais le signe "moins" n'est pas seulement un délimiteur puisqu'il apparait également dans les exposants (exposants négatifs).
D'ou mon problème :/

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_sammie Messages postés 9 Date d'inscription jeudi 18 août 2005 Statut Membre Dernière intervention 22 août 2005
19 août 2005 à 14:26
Salut,



A priori, la classe ci-dessous fait ce que tu demandes. Y'a peut etre
des cas particuliers à gérer, notamment si ton nombre de lignes est
impair, ou qu'une ligne ne contient pas 3 nombres.



J'espère que ca t'aide,



Sammie.



public class Analyseur {



public String execute(String pParam) {

String resultat = null;

// Suppression des \n, pour obtenir une chaine complète sans retour à la ligne

String fichier = mettreAPlat(pParam);

// Analyse du fichier, et
récupération d'une liste de String, chaque string représentant un des
nombres du fichier initial

List lstNombres = analyser(fichier);

// Travail sur les nombres
précédemment récupérés. En l'occurence, on souhaite les intervertir.

List lstResultats = intervertir(lstNombres);

// On rajoute les "\n", pour
pouvoir générer le fichier avec autant de lignes qu'initialement.

String sb = mettreEnLignes(lstResultats);

return sb.toString();

}



private String mettreEnLignes(List lstResultats) {

// Construction du String resultat

StringBuffer sb = new StringBuffer();

int compteur =0;

for (Iterator iter = lstResultats.iterator(); iter.hasNext();) {

String element = (String) iter.next();

sb.append(element);

if (++compteur == 3) {

compteur = 0;

sb.append("\n");

}

}

return sb.toString();

}



private List intervertir(List lstNombres) {

// intervertion des nombres

List lstResultats = new ArrayList();

for (Iterator it = lstNombres.iterator(); it.hasNext(); ) {

String element1 = (String) it.next();

String element2 = (String) it.next();

lstResultats.add(element2);

lstResultats.add(element1);

}

return lstResultats;

}



private List analyser(String fichier) {

// on conserve les délimiteurs, pour tester si c'est un "-"

StringTokenizer st = new StringTokenizer(fichier, " -", true);

String precedent = "";

List lstNombres = new ArrayList();

while (st.hasMoreTokens()) {

String token = st.nextToken();

if ("-".equals(token)) {


boolean finitParE = precedent.length() >= 1 &&
"E".equals(precedent.substring(precedent.length()-1));


// On regarde si le precedent etait un caractere "E"

if (finitParE) {


// C'est le cas : on ajoute le token precedent, le delimiteur, et le
prchian jeton (l'exposant)


precedent = precedent + token + st.nextToken();

}

else {


// Le "-" rencontré est un délimiteur entre nombres. On fait le meme
traitement que si c'était un espace


// le prochain token est un nombre, et le precedent aussi


lstNombres.add(precedent);


precedent = token + st.nextToken();

}

}

else if (" ".equals(token) && !"".equals(precedent)){


// precedent est un nombre complet. On l'ajoute à la liste des nombres,
et on réinitialise precedent.

lstNombres.add(precedent);

precedent = " ";

} else {

// le token est le nombre

precedent = precedent + token;

}

}

// Le dernier n'a pas ete ajoute

if (precedent.length() > 1) {

lstNombres.add(precedent);

}

return lstNombres;

}



private String mettreAPlat(String pParam) {

// Suppression des \n

StringTokenizer st1 = new StringTokenizer(pParam, "\n");

StringBuffer sbFichier = new StringBuffer();

while (st1.hasMoreTokens()) {

sbFichier.append(st1.nextToken());

}

return sbFichier.toString();

}



public static void main(String[] args) {

Analyseur analyseur = new Analyseur();

String input =

"
0.0000000000000000E+00 0.4793504714965820E+01-0.3685846924781799E+00\n"
+

"
0.4763874053955078E+01-0.3189862668514252E+00 0.4729751586914063E+01\n"
+


"-0.2703143358230591E+00
0.4559299945831299E+01-0.7672241926193237E+00\n" +

"
0.4537451267242432E+01-0.7189077734947205E+00 0.4514544963836670E+01\n"
+

"
0.8216846734285355E-01-0.7416048526763916E+01-0.9867453575134277E-01\n"
+


"-0.7280107975006104E+01-0.2747862935066223E+00-0.7139624118804932E+01\n";

String resultat = analyseur.execute(input);

String output =

"
0.4793504714965820E+01 0.0000000000000000E+00 0.4763874053955078E+01\n"
+


"-0.3685846924781799E+00
0.4729751586914063E+01-0.3189862668514252E+00\n" +

"
0.4559299945831299E+01-0.2703143358230591E+00 0.4537451267242432E+01\n"
+


"-0.7672241926193237E+00
0.4514544963836670E+01-0.7189077734947205E+00\n" +


"-0.7416048526763916E+01
0.8216846734285355E-01-0.7280107975006104E+01\n" +


"-0.9867453575134277E-01-0.7139624118804932E+01-0.2747862935066223E+00\n";

assert (resultat.equals(output));

}

}
Rejoignez-nous