Ecriture dans un fichier

oncle jules Messages postés 43 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 19 septembre 2005 - 26 juil. 2005 à 12:02
cs_tigroux Messages postés 105 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 22 octobre 2008 - 19 août 2005 à 08:33
Salut à tous
je programme un soft qui récupère des données d'un premier fichier pour les réécrire dans un second.
Seulement voilà, je n'arrive pas à trouver le moyen de choisir le nombre de chiffres à écrire par ligne.
J'aimerais en écrire 6 par ligne, et tout ce que j'ai réussi à faire, c'est à les mettre tous à la suite.
Merci beaucoup pour votre aide.
++

36 réponses

cs_tigroux Messages postés 105 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 22 octobre 2008 16
9 août 2005 à 08:38
Pour le stringTokanizer je ne m'en sert jamais moi donc je ne peux pas t'aider. Mais normalement avec le code que je t'ai donné tu dervais être proche de ce que tu veux. Sinon regarder dans le doc de String pour avoir plus de fonction peux etre que tu trouveras celle qu'il te faut
oncle jules Messages postés 43 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 19 septembre 2005
11 août 2005 à 00:56
Salut Tigroux
j'ai abandonné l'utilisation simultanée du StreamTokenizer et du BufferedReader pour n'utiliser finalement que BufferedReader.
Je veux stocker la première valeur (un entier, 5520) de la seconde ligne car elle code le fichier.
J'ai donc défini un BufferedReader reader ...
J'ai sauté la première ligne avec un readLine() sans stocké sa valeur.
Je suis donc à présent sur la seconde ligne.
Naïvement, j'ai pensé qu'écrire

int num;
num=reader.read();

capturerait le 1er caractère autrement dit le 1er entier qui m'intéresse; hélas ce n'est pas le cas. J'ai affiché ce que ces lignes capturaient réellement : il s'agit du 3ème entier de la 1ère ligne (32)

Je ne vois vraiment pas pourquoi il me prend la 3ème valeur de la 1ère ligne alors que je l'ai sauté ... enfin je pense ;)
cs_tigroux Messages postés 105 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 22 octobre 2008 16
11 août 2005 à 08:57
En fait ca doit bien te renvoyer la bonne valeur mais en valeur entière tu dois faire
Integer.toString(num); pour avoir sa vrai valeur
oncle jules Messages postés 43 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 19 septembre 2005
11 août 2005 à 14:48
Salut Tigroux

En fait je ne pense pas qu'il s'agisse de la transformation du int en string car je l'ai mis dans le programme valueOf.
Je veux récupérer la 1ère valeur (5520) de la 2ème ligne et je ne comprends vraiment pas pourquoi c'est toujours le 32 (3ème valeur de la 1ère ligne) qu'il stocke. De plus j'ai essayé d'enlever le 1er readLine() et d'en rajouter pour voir si c'était toujours le cas, et c'est effectivement toujours le cas.
Voici le bout de code concerné

public String parse_vvp3() {
String tmp3 = "";
int num;
try {
BufferedReader br = new BufferedReader(new FileReader(f_atila));
BufferedWriter bw;
bw = new BufferedWriter(new FileWriter(f_sysnoise,true));
br.readLine();br.readLine();br.readLine();br.readLine();
num = br.read();
System.out.println(num);
String numero = new String();
numero = numero.valueOf(num);
System.out.println(numero);
br.readLine();
while ((tmp3 = br.readLine()) != null) {
tmp3 = br.readLine();
bw.write(tmp3 + "\r");
if ( (tmp3 = br.readLine()).startsWith("5520")) {
System.out.println("thales");
br.close();System.exit(0);
}
}
br.close();
}//fin try
catch (Exception ex) {
JOptionPane.showMessageDialog(null,
"Erreur lors de la lecture vvp3 du fichier " +
f_atila.getName(),
"Erreur",
JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
return tmp3;
}//fin

Encore un grand merci pour toute ton aide..... il faut absolument que je termine ceci en fin de semaine prochaine, je ferais surement encore appel à toi
Merci ++

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

Posez votre question
cs_tigroux Messages postés 105 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 22 octobre 2008 16
11 août 2005 à 15:14
JE vois pas du tout pourquoi. Essaye d'afficher apres le premier br.readLine(), le contenu du deuxieme br.readLine pour voir si il te prend bien le bon fichier
oncle jules Messages postés 43 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 19 septembre 2005
11 août 2005 à 15:30
j'ai affiché le contenu du deuxième readLine() et il m'affiche bien la deuxième ligne: il prend le bon fichier.
C'est peut-être la méthode read qui n'est pas adaptée.
Qu'en penses-tu ?
tu ne connaîtrais pas un autre moyen de récupérer cette valeur ?
cs_tigroux Messages postés 105 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 22 octobre 2008 16
12 août 2005 à 09:18
Ben si la position dans la ligne ne changera pas, tu utilise le readLine et ligne.substring(pos, pos+4)

Sinon tu fais comme je t'avais ecrit plus haut càd

tmp3 = br.readLine();
String tmp = tmp3.replaceAll(" ", ""); // On supprime tout les espace ainsi ton chiffre est en début de ligne
et ensuite tmp.substring(0,4); // 4 ou 3 je ne sais plus
oncle jules Messages postés 43 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 19 septembre 2005
14 août 2005 à 13:01
le probleme avec le replaceAll() c'est que le nombre en question (ici 5520) peuvent avoir 2, 3, 4 ou même de chiffres qui le compose, donc je ne sais utiliser substring .....

J'ai une autre idée
Je capture un entier avec lequel je fais deux petites opérations élémentaires.
Et suivant le résultat, si c'est un entier ou un double, je continue...
C'est cette condition que je n'arrive pas à implémenter.
Je te donne un exemple:
Je capture l'entier 40.
je fais mes petites opérations: (40/3)/2
le résultat est 6,66.
Lorsqu'il s'agit d'un double, il faut que je le transforme en entier (le 1er entier supérieur)
c'est à dire, ici transformer 6,66 en 7
Je vois vraiment pas comment gérer les conditions sur les types avec le if
oncle jules Messages postés 43 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 19 septembre 2005
14 août 2005 à 14:49
Salut
j'ai trouvé comment faire. Il faut utiliser la méthode ceil (renvoie l'entier le plus proche supérieur ou égal à l'argument)
J'ai écrit mon code mais il refuse d'écrire dans le fichier

public void parse_vvp3() {
String tmp3 = "";
int num;
double NbVecProp;double num1;double num11;
int NbValProp;int num2;
BufferedWriter bw;
try {
FileReader f_r = new FileReader(f_atila);
StreamTokenizer st = new StreamTokenizer(f_r);
BufferedReader br = new BufferedReader(new FileReader(f_atila));
bw = new BufferedWriter(new FileWriter(f_sysnoise,true));

for (int i=0; i<5; i++) {
st.nextToken();
}
//je récupère les entiers souhaités
st.nextToken();
NbVecProp = (int)st.nval;
System.out.println(NbVecProp);
st.nextToken();
NbValProp = (int)st.nval;
System.out.println(NbValProp);

//je saute les 5 1ères lignes
for (int j=0; j<5; j++) {
//br.readLine();
System.out.println("ligne" +j+br.readLine());
}

num1 = (NbVecProp/2)/3;System.out.println(num1);
num11 = (int)Math.ceil(num1);
System.out.println(num11);


for (int k=0; k<num11; k++) {
//System.out.println(br.readLine());
bw.write(br.readLine() + "\n");
}
// ici quand j'utilise le system.out.println, il m'affiche bien ce qu'il doit ecrire dans le fichier. Mais lorsque je passe bw.write, il n'ecrit rien dans le fichier


br.close();
bw.close();
}//fin try
catch (Exception ex) {
JOptionPane.showMessageDialog(null,
"Erreur lors de la lecture vvp3 du fichier " +
f_atila.getName(),
"Erreur",
JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
}//fin parse_vvp3

comprends pas.
oncle jules Messages postés 43 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 19 septembre 2005
14 août 2005 à 18:17
La méthode avec split ne semble pas marcher car des fois il y a des espaces et des fois non ..
je pensais en fait créer un vecteur comportant toutes les valeurs de deux lignes. J'aurais donc un vecteur de 6 éléments et donc pour l'écriture ce sera plus simple de travailler avec les indices. et je fais une boucle avec cette idée jusqu'a la fin du fichier.
NB: le nombre de valeurs est un nombre pair
Premier problème :
je souhaite directement au suivant 5520 (rouhe gras aussi, de la 13ème ligne) ce n'est pas toujours la 13ème ligne ...
comment de faire une boucle genre while qui lit tous les token jusqu'à arriver au token "5520".
j'ai toujours des erreurs avec startsWith
Deuixème problème:
une fois que je suis au niveau du deuxième 5520 du fichier. je dois réécrire toutes les valeurs qui suivent avec la modification suivante : je dois intervertir les valeurs deux à deux. Autrement dit, la deuxième valeur devient la première, la première devient la seconde. La troisième devient la quatrième valeur et la quatrième devient la troisième et ainsi de suite...

je vais créer un nouveau post
++
cs_tigroux Messages postés 105 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 22 octobre 2008 16
15 août 2005 à 10:21
1 probleme:
Le probleme est que si ton texte contient 5520 à un autre endroit je ne sais pas comment tu vas faire pour identifier que c le bon.
Si il n'y en pas d'autre avec startsWith ca devrait marcher regarde dans la doc de la classe String ou donne moi l'erreur que tu as.

2 probleme :
le valeur sont separés pas des espaeces la meilleur facon et de faire le split comme je te l'ai expliqué au début.
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 à 11:06
salut
Je n'ai plus d'erreur ...
En passant je me suis mal expliqué je crois
en fait est ce que je peux utiliser replaceFirst("5520", "");
en sachant qu'il ne s'agit pas toujours de 5520, mais d'un entier que j'ai récupéré dans une variable NbValProp.
De plus, lors de l'écriture dans le fichier destination, NbValProp (5520) doit apparaitre comme dans le fichier source.
Qu'en penses-tu ?

Le programme se compile et s'éxécute, il écrit même des choses dans le fichier mais il les écrit d'une façon assez incompréhensible.
Voici le code :

public void parse_vvp3() { String tmp3 "";String ligne "";
int num;
double NbVecProp;double num1;double num11;
int NbValProp;int num2;
BufferedWriter bw;
try {
FileReader f_r = new FileReader(f_atila);
StreamTokenizer st = new StreamTokenizer(f_r);
BufferedReader br = new BufferedReader(new FileReader(f_atila));
bw = new BufferedWriter(new FileWriter(f_sysnoise,true));

for (int i=0; i<5; i++) {
st.nextToken();
}
st.nextToken();
NbVecProp = (int)st.nval;//je récupère l'entier 40 de la 1ère ligne
System.out.println(NbVecProp);


st.nextToken();
NbValProp = (int)st.nval;//je récupère l'entier 5520 de la 2ème ligne
System.out.println(NbValProp);

num1 = (NbVecProp/2)/3;System.out.println(num1);// à partir de la, je réécrit les lignes qui précèdent le 5520
num11 = (int)Math.ceil(num1);
System.out.println(num11);

for (int j=0; j<5; j++) {
br.readLine();
}


for (int k=0; k<num11; k++) {
//System.out.println(br.readLine());
bw.write(br.readLine() + "\n");
}

System.out.println(br.readLine());
//arrivé là je suis à la ligne qui commence par 5520
ligne = ligne.replaceFirst("5520","");
String [] tabLigne;
String temp;
while (br.readLine() != null) {
tabLigne = ligne.split(" ");
for (int i=0; i<tabLigne.length-1; i++) {
temp = tabLigne[i];
if (i <= tabLigne.length-2) {
bw.write(tabLigne[i+1]);
bw.newLine();
bw.write(tabLigne[i]);
bw.newLine();
}
else {
bw.write(tabLigne[i]);
bw.newLine();
}
}
ligne = br.readLine();
}


bw.write("\n");
br.close();
bw.close();
}//fin try
catch (Exception ex) {
JOptionPane.showMessageDialog(null,
"Erreur lors de la lecture vvp3 du fichier " +
f_atila.getName(),
"Erreur",
JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
//return tmp3;
}//fin parse_vvp3

et voilà ce qu'il écrit dans le fichier destination:


11 3 32 0 7 40
5520 1 1 1 5 5
32* COFI v.2 IDEAS v.11 *
07/13/05 VVPR 1 0 0
7 5 20 5 138 0 1 1
40 0.6978044820836787E+10 0.1238774153323844E+11 0.1901403936761112E+11
0.3445260201620660E+11 0.4048589907678004E+11 0.6673256768859634E+11
0.1133983935650789E+12 0.1266392523039663E+12 0.2253733675547690E+12
0.3181668544154566E+12 0.5255469213822878E+12 0.6458133052264467E+12
0.7453467372541699E+12 0.1097179188940539E+13 0.1184914291018450E+13
0.1680306774352798E+13 0.1888042254866058E+13 0.2418814107784721E+13
0.2931585857945411E+13 0.3329695498910833E+13
0.4833709239959717E+01

0.0000000000000000E+00
0.4833709239959717E+01
0.4816733837127686E+01
0.0000000000000000E+00
0.4763874053955078E+01-0.3189862668514252E+00


0.4729751586914063E+01
0.4763874053955078E+01-0.3189862668514252E+00
0.4537451267242432E+01-0.7189077734947205E+00


0.4514544963836670E+01
0.4537451267242432E+01-0.7189077734947205E+00
0.4465955257415772E+01-0.5764250159263611E+00


0.4178462982177734E+01
0.4465955257415772E+01-0.5764250159263611E+00
0.4052823543548584E+01-0.9506744742393494E+00


0.3689800500869751E+01
0.4052823543548584E+01-0.9506744742393494E+00
0.3601814270019531E+01-0.1586763143539429E+01


0.3557123661041260E+01
0.3601814270019531E+01-0.1586763143539429E+01
0.3115625619888306E+01-0.2379174947738648E+01


0.3003113269805908E+01
0.3115625619888306E+01-0.2379174947738648E+01
0.2505179882049561E+01-0.3095524787902832E+01


0.2434578657150269E+01
0.2505179882049561E+01-0.3095524787902832E+01
0.2294208526611328E+01-0.2787433385848999E+01


0.2224089860916138E+01
0.2294208526611328E+01-0.2787433385848999E+01
0.1725868463516235E+01-0.3686450004577637E+01


0.1565413713455200E+01
0.1725868463516235E+01-0.3686450004577637E+01
0.1220662713050842E+01-0.4658608913421631E+01


0.1130441784858704E+01
0.1220662713050842E+01-0.4658608913421631E+01
0.9516344070434570E+00-0.4358066558837891E+01


0.8017138242721558E+00
0.9516344070434570E+00-0.4358066558837891E+01
0.4248640537261963E+00-0.5289236545562744E+01


0.3880047798156738E+00
0.4248640537261963E+00-0.5289236545562744E+01
0.1967532783746719E+00-0.6396286487579346E+01


0.1027054414153099E+00
0.1967532783746719E+00-0.6396286487579346E+01
0.8216846734285355E-01-0.7416048526763916E+01-0.9867453575134277E-01


0.0000000000000000E+00
-0.2047498822212219E+00-0.9540111541748047E+01
0.0000000000000000E+00-0.9721148490905762E+01


0.0000000000000000E+00
0.0000000000000000E+00-0.9721148490905762E+01
0.0000000000000000E+00-0.5617090225219727E+01


-0.5636204242706299E+01
0.0000000000000000E+00-0.5517447471618652E+01
-0.5557096958160400E+01


0.2755729556083679E+00-0.5032186031341553E+01
-0.5112386703491211E+01
0.9242551922798157E+00-0.3770442485809326E+01
-0.3832251787185669E+01
0.2578631639480591E+00-0.1995595574378967E+01
-0.3634879827499390E+01
0.8026517629623413E+00
-0.1639322042465210E+01
0.1412902772426605E+00
0.8026517629623413E+00.......

La copie de fichier se fait parfaitement pour ce qui est du texte en rouge gras.
Je ne comprend pas trop ce petit bout de programme.
A quoi sert newLine() ??
sauter une ligne ?
l'instruction for (int i=0; i<tabLigne.length-1; i+2)
lancait une erreur au niveau de l'incrémentation (not a valid statement)
j'ai donc changé en for (int i=0; i<tabLigne.length-1; i++) ????

MERCI
++
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 à 11:30
En fait il me mets les nombres à chaque ligne et il ne considère pas les signes "-" comme un nouveau nombre :/
alors qu'il faudrait en mettre 3 par lignes .....
cs_tigroux Messages postés 105 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 22 octobre 2008 16
16 août 2005 à 08:52
Ne fais pas de br.readLine sans stocker la valeur dans le system.out et dans le while car sinon tu lis la ligne mais tu perd les données.

Sinon pour le i++ ce n'est pas la solution car la tu fais deux fois l'echange le i+2 était correct mais le probleme doit venir d'ailleurs dis moi ce que ca te disais. C t à l'execution ou à la compilation?
Si c à la compile essaye avec i += 2 plutot.

Sinon pour le reste je ne peux pas t'aider plus je ne vois pas l'erreur
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:22
Salut Tigroux
Je n'ai plus d'erreur à la compilation ni à l'exécution. J'ai remplacé l'incrémentation par i+=2 comme tu me l'avais conseillé.
Mais le problème est plus compliqué. La méthode split tronque les String suivant un délimiteur, dans le programme c'est l'espace. Cependant dans le fichier certaines valeurs sont négatives et le signe "moins" vient tout de suite après la valeur précédente.
Exemple :
0.4763874053955078E+01-0.3189862668514252E+00 0.4729751586914063E+01
J'ai donc ajouter un split avec pour délimiteur le signe "moins". Mais malheureusement, le problème n'est toujours pas entièrement résolu car certaines valeurs ont un exposant négatif.
Exemple :
0.3837378323078156E-01-0.3889748334884644E+01 0.1150791287422180E+01
tu comprends que ça va me tronquer les chaines un peu n'importe où .....
Je regarde d'autres possibilités telle que la classe StringTokenizer qui gère également la notion de délimiteur dans son constructeur, mais je me retrouve face au même problème avec le signe "moins".....
Je suis pas encore sorti de l'auberge :/
Si tu as d'autres idées...
++
Merci
cs_tigroux Messages postés 105 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 22 octobre 2008 16
19 août 2005 à 08:33
Ben tu peux faire comme tu fais la mais ensuite quand tu as ta case de tableau tu teste si ta chaine fini par un E si c le cas tu prend aussi la case suivant avec le signe eventuelle mais ca devient du code assez degeulasse.
Mais bon au grand maux les grand moyens
Rejoignez-nous