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

mouzart Messages postés 161 Date d'inscription mardi 26 avril 2005 Statut Membre Dernière intervention 6 novembre 2008 4
26 juil. 2005 à 12:08
salut je sait pas si tu fait une copie coller ou pas si ces le cas tu dois lire une ligne de ton premier fichier et le reecrire dans ton deuxieme.et c'est trop compliquer a faire
0
safisoft Messages postés 489 Date d'inscription vendredi 30 janvier 2004 Statut Membre Dernière intervention 13 mai 2009 6
26 juil. 2005 à 12:24
mé qu'est ce qui est compliqué!!!!!

ok ta pas expliquer la nature de tes fichiers mais puisque tu parle de
lignes, si tu utilise un PrintWriter(FileOutputStream) tu peux utiliser
la methode .println(string) .
0
cs_tigroux Messages postés 105 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 22 octobre 2008 16
26 juil. 2005 à 17:25
Sinon c simple tu definit ton "reader" et ton "writer", ensuite tu peux faire :
String ligneLu = reader.readLine();
String mot = "";
while(ligneLu != null) {
mot = mot + ligneLu; // pour conserver la fin de ligne si le nombre de carac n'est pas multiple de 6
while(mot.length > 6) {
writer.write(mot.substring(0,6)); // a verifier pour le 6 je sais plus si c 6 ou 5
writer.newLine();
mot= mot.substring(6,mot.length); // idem pour la verifie le 6
}
LigneLu = reader.readLine();
}

et voila avec ca ca devrait marcher à une ou 2 erreurs de frappe près
0
oncle jules Messages postés 43 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 19 septembre 2005
27 juil. 2005 à 21:22
Hello tout le monde
Merci pour votre aide
J'ai procédé autrement :
J'ai récupéré les données dans une classe vector et j'ai appellé les 6 premiers éléments pour la première ligne
et les 6 autres dans la deuxième ligne.
C'est pas très élégant.
J'ai réussi à réécrire les 2 premières lignes dans le format souhaité mais je galère grave pour le reste du fichier.
Faut dire qu'il y a pas mal de ligne (fichier de 65Ko :O)
J'aimerais bien vos conseils car il s'agit je pense d'une programmation pas trop compliquée (je me suis mets a java depuis 3mois exprès pour ça :/)
voici un extrait du fichier que je dois lire:
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
5520 0.4877913475036621E+01 0.0000000000000000E+00 0.4864388942718506E+01
0.0000000000000000E+00 0.4849582672119141E+01 0.0000000000000000E+00
0.4833709239959717E+01 0.0000000000000000E+00 0.4816733837127686E+01
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.6711576581001282E+00 0.4490724086761475E+01-0.6236515641212463E+00
0.4465955257415772E+01-0.5764250159263611E+00 0.4178462982177734E+01

Et ainsi de suite dans le modèle de la dernière ligne.
Et voici le code que j'ai écrit pour lire ce fichier et le réécrire.
Je dois réécrire le fichier tel quel mis à part un changement.
En fait je voudrais modifier ce fichier à partir de ligne ou le numéro 5520 en noir gras apparait.
Il faudrait intervertir les valeurs deux à deux : je m'explique
la première valeur qui suit le 5520 doit etre ecrite en deuxième position.
Donc la première valeur devient la seconde et la seconde devient la première.
La troisième devient la quatrième et la quatrième devient la troisième
et ainsi de suite jusqu'à la fin du fichier.
Voici mon code/
package cofi.cavs2;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.StreamTokenizer;
import java.util.Vector;
import java.io.*;
import javax.swing.JOptionPane;


/**
* Cavs2
* modification du fichier .vvpr dans un cas axisymmétrique
*/


public class Traduire_fichier2 {
public File f_atila;
public File f_sysnoise;
public Traduire_fichier2(File fic_trad,File fic_gen) {
f_atila = fic_trad;
f_sysnoise = fic_gen;
}


/**
* Lit le fichier de ATILA et en extrait les valeurs associées au mode.
* Ces valeurs sont stockées dans un vecteur dans l'ordre ou elle sont lues.
* @return le vecteur contenant les valeurs lues
*/


/**
* parse le vvp0
*/
public Vector parse_vvp0() {
Vector v0 = new Vector(12);
String tmp0 = "";
try {
FileReader f_r = new FileReader(f_atila);
StreamTokenizer st = new StreamTokenizer(f_r);
int moment = 0;
st.wordChars('0','9');
st.wordChars('-','-');
st.wordChars('.','.');
//st.eolIsSignificant(true);
while (st.nextToken() != StreamTokenizer.TT_EOF) {
switch (moment) {
case 0:
tmp0 = "" + st.nval;
v0.add(tmp0);
if (v0.size()>13) {
//moment = 1;
break;
}
break;


}//fin switch
}//fin while
//....................................f_r.close();
}//fin try
catch (Exception ex) {
JOptionPane.showMessageDialog(null,
"Erreur lors de la lecture du fichier" +
f_atila.getName(),
"Erreur",
JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
return v0;
}//fin parse_vvp0



// public Vector parse_vvp1() {
//
// }



public Vector parse_vvp2() {
Vector v2 = new Vector(8);
String tmp2 = "";
try {
FileReader f_r = new FileReader(f_atila);
StreamTokenizer st = new StreamTokenizer(f_r);
int moment = 0;
st.wordChars('0','9');
st.wordChars('-','-');
st.wordChars('.','.');
while (st.nextToken() != StreamTokenizer.TT_EOF) {
switch (moment) {
case 0:
if(st.nextToken() == StreamTokenizer.TT_EOL)
moment = 1;
break;
case 1:
if(st.nextToken() == StreamTokenizer.TT_EOL)
moment = 2;
break;
case 2:
if(st.nextToken() == StreamTokenizer.TT_EOL)
moment = 3;
break;
case 3:
if(st.nextToken() == StreamTokenizer.TT_EOL)
moment = 4;
break;
case 4:
tmp2 = "" + st.nval;
v2.add(tmp2);
if (v2.size()>9) {
moment = 5;
break;
}
break;
}//fin switch
}//fin while
//f_r.close();
}//fin try
catch (Exception ex) {
JOptionPane.showMessageDialog(null,
"Erreur lors de la lecture du fichier" +
f_atila.getName(),
"Erreur",
JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
return v2;
}//fin parse_vvp2



/**
* parse le vvp3
*/
public Vector parse_vvp3() {
Vector v3 = new Vector();
vvp3 vp3 = new vvp3();
String tmp3 = "";
try {
FileReader f_r = new FileReader(f_atila);
StreamTokenizer st = new StreamTokenizer(f_r);
int moment = 0;
st.wordChars('0','9');
st.wordChars('-','-');
st.wordChars('.','.');
while (st.nextToken() != StreamTokenizer.TT_EOF) {
switch (moment) {
case 0:
vp3.numero = (int)st.nval; tmp3 "" +st.nval; //<---ligne fausse tmp3 vp3.numero + st.nval;
v3.add(tmp3);
if (v3.size() > ((vp3.numero)/2))
break;
}//fin switch
}//fin while
//f_r.close();
}//fin try
catch (Exception ex) {
JOptionPane.showMessageDialog(null,
"Erreur lors de la lecture du fichier" +
f_atila.getName(),
"Erreur",
JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
return v3;
}//fin parse_vvp3



/**
* fonction générant à partir des valeurs contenues dans les vecteurs val
* le contenu du fichier .vvpr
* @param val tableau des valeurs des modes
*/
public void generer(Vector val, Vector val2) {
FileWriter fw;
String tmp0 = "";
String tmp2 = "";
int i,j;

try {
fw = new FileWriter(f_sysnoise,true);

for (i=0; i<6; i++) { //for (i=0; i<val.size(); i++) {
fw.write((String)val.get(i) +"\t");
}
fw.write("\n");
for (i=6; i<12; i++)
fw.write((String)val.get(i) +"\t");
fw.write("\n");



for (j=0; j<8; i++)
fw.write((String)val2.get(j) + "\t");
fw.write("\n");





fw.close();
}
catch (IOException ex) {
JOptionPane.showMessageDialog(null,
" Erreur lors de la génération du fichier .vvpr",
"Erreur",
JOptionPane.ERROR_MESSAGE);
ex.printStackTrace();
}
}//fin generer


}//fin Traduire_fichier

Je n'ai pas implémenté le fait de devoir intervertir les valeurs deux à deux parce que je sais pas trop comment m'y prendre.
Dites moi ce que vous pensez de ce code pas très catholiques ;) et si vous avez des idées pour avancer dans ces méandres informatiques ;)
Merci beaucoup beaucoup
++
0

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

Posez votre question
oncle jules Messages postés 43 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 19 septembre 2005
28 juil. 2005 à 09:18
re tout le monde
des infos complémentaires omises et des plus importantes ;)
je n'ai pas d'erreur à la compilation mais lorsque je lance ce sous-programme, j'ai une exception:
java.lang.ArrayindexOutOfBoundsException: array index out of range : 0

at java.util.vector.get(Vector.java: 709)
at Traduire_fichier2.java: 212
----> fw.write((String)val2.get(j) + "\t");

Je n'arrive plus à rien de concluant.
Merci de votre aide
++
0
cs_tigroux Messages postés 105 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 22 octobre 2008 16
28 juil. 2005 à 13:50
Ton erreur doit venir que tu essaye de récuperer une valeur dans val2 qui est hors de la taille. Sinon pour intervertir tes lignes, je ferait ca comme ca mois (c pas super propre mais ca marche au moins)

une fois que tu es placé au bonne endroit dans ton fichier, tu utilise la fonction split
donc tu as ta String ligne qui contient la ligne que tu viens de lire et tu fais String [] tabLigne = ligne.split(" ") ce qui te donne un tableau de String et ensuite tu as plus qu'a faire

String temp;
for(int i = 0; i < tabLigne.length-1 ; i+2) {
temp = tabLigne[i];
if(i <= tabLigne.length-2) { // Pour etre sur que tu as une valeur en i+1
tabLigne[i] = tabLigne[i+1];
tabLigne[i+1] = temp;
}
}

voila je ferai comme ca.
Pour le reste du code je n'ai pas trop regarder car je sais pas trop ce que tu souhaite faire exactement.

Au fait ta ligne commencera toujours par 5520?

Tu dois faire quelque chose avec les données placé avant?
0
oncle jules Messages postés 43 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 19 septembre 2005
28 juil. 2005 à 14:24
salut
merci beaucoup pour ton aide
en fait je ne souhaite pas intervertir les lignes deux à deux mais les valeurs ....
Les données placées avant sont à réécrire telles qu'elles sont dans le fichier destination.
Est ce que tu aurais une autre idée pour intervertir les valeurs ?

Je pars tout de suite étudier ta proposition pour la taille de val2.

Merci beaucoup :D
0
cs_tigroux Messages postés 105 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 22 octobre 2008 16
28 juil. 2005 à 14:40
Ben en fait je n'intervertit pas les lignes deux à deux mais bien les valeurs separé par des espace. Si tu dois réecrie les valeurs tels quel c'est facile, tu fais
tu definit un BufferWriter write et BufferReader read:

String ligne;
while(!(ligne = reader.readLine()).startWith("5520")) {
writer.write(ligne);
writer.newLine();
}
// Quand tu es la c'est que tu es sur ton 5520
// D'abord on l'enleve
ligne = ligne.replaceFirst("5520", "");
// et ensuite tu boucle pour intervertir
String [] tabLigne;
String temp;
while(ligne != null) {
tabLigne = ligne.split(" ");
ligne = ""; // a mettre que si tu veux intervertir la dernière ligne avec la première de la ligne suivante
for(int i = 0; i < tabLigne.length-1 ; i+2) {
temp = tabLigne[i];
if(i <= tabLigne.length-2) { // Pour etre sur que tu as une valeur en i+1
writer.write(tabLigne[i+1]);
writer.newLine();
writer.write(tabLigne[i]);
writer.newLine();
}
else {
writer.write(tabLigne[i]);
writer.newLine();
}
}
ligne = read.readLine();
}

et voila c'est aussi simple que ca. Attention si le nombre de valeur n'est pas multiple de 2 la dernière valeur ne sera pas remplacer, si c'est pas ce que tu souhaite, facile tu enleve le contenu du else, et tu fais à la place ligne = tabLigne[i];et à la place de ligne read.readLine(); tu fais ligne ligne + " " + read.readLine();
0
oncle jules Messages postés 43 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 19 septembre 2005
29 juil. 2005 à 10:44
salut tigroux
merci pour ton aide
je suis en train d'implémenter tout ceci en même temps que je me documente sur certains points car tout n'est pas très bien clair.
Je te tiens au courant... j'aurai surement d'autres questions
++
0
cs_tigroux Messages postés 105 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 22 octobre 2008 16
29 juil. 2005 à 15:21
Sans probleme
0
oncle jules Messages postés 43 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 19 septembre 2005
3 août 2005 à 10:41
salut tigroux et tt le monde :)
j'ai essayé le bout de programme que tu m'as filé sur un petit exemple et ca a l'air de marcher :D Merci
J'ai une autre "petite" question
J'aimerais savoir comment faire pour sauter des lignes quand je lis un fichier.
D'habitude pour sauter une ligne, j'utilise un StreamTokenizer.TT_EOL ou un \n.
Mais il faudrait qu'à la lecture, je saute les 4 premières lignes consécutives et je ne vois vraiment pas comment procéder.
je n'ai hélas rien trouver de concluant sur le net.
Merci beaucoup pour votre aide.
A très bientôt!!!
0
cs_tigroux Messages postés 105 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 22 octobre 2008 16
3 août 2005 à 12:12
ben tu fais reader.readLine 4 fois et tu stock pas les données
0
oncle jules Messages postés 43 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 19 septembre 2005
3 août 2005 à 13:28
salut
j'ai essayé avec readLine()

FileReader fr = new FileReader(NomDuFichier);
fr.readLine();

mais j'ai une erreur lors de la compilation
cannot resolve symbol
symbol : fr.readLine()
^

J'ai essayé de récupérer les infos issus du readLine dans un string que je n'appellerai pas
String ligne;
ligne.readLine();

mais j'ai toujours la même erreur: cannot resolve symbol
symbol : ligne.readLine();
^

Je ne comprends pas; la syntaxe me paraissait bonne, il y a surement quelque chose qui a du m'échapper ....

En tout cas merci beaucoup pour toute aide précieuse
0
oncle jules Messages postés 43 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 19 septembre 2005
3 août 2005 à 15:24
je crois que ca vient tout simplement du fait que je n'ai pas défini de BufferedReader ... :/
0
cs_tigroux Messages postés 105 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 22 octobre 2008 16
3 août 2005 à 15:50
C ca tu dois definir un BufferedReader qui prend en parametre ton FileReader voila ensuite tu auras bien le readLine
0
oncle jules Messages postés 43 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 19 septembre 2005
4 août 2005 à 15:32
Salut
c'est encore moi ;)
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
5520 0.4877913475036621E+01 0.0000000000000000E+00 0.4864388942718506E+01
0.0000000000000000E+00 0.4849582672119141E+01 0.0000000000000000E+00
0.4833709239959717E+01 0.0000000000000000E+00 0.4816733837127686E+01
0.0000000000000000E+00 0.4793504714965820E+01-0.3685846924781799E+00
0.4763874053955078E+01-0.3189862668514252E+00 0.4729751586914063E+01

Voilà où j'en suis : j'ai copié les 5 premières lignes.
A présent je voudrais copié les ligne suivantes du nombre 40 (en gras noir) jusqu'à la ligne qui commence par 5520 (rouge gras) non incluse.
Mon idée est de stocker ce nombre 5520 dans une variable de type string. Je la récupère en fait dès la deuxième ligne (il s'agit du même nombre).
Donc si je récapitule, je copie les 5 premières lignes en stockant le 5520 de la 2ème ligne. Arrivé au niveau de la 6ème ligne je souhaite faire une boucle genre while (jusqu'à trouver le caractère 5520) stocker les lignes avec readLine().
Voici le bout de programme que j'ai fais pour ça.

public String parse_vvp3() {
String tmp3 = "";
String num = "";
int moment = 0;
try {
FileReader f_r = new FileReader(f_atila);
StreamTokenizer st = new StreamTokenizer(f_r);
st.wordChars('0','9');
BufferedReader br = new BufferedReader(new FileReader(f_atila));
br.readLine();


while (st.nextToken() != StreamTokenizer.TT_EOF) {
switch (moment) {
case 0:
if (st.ttype == StreamTokenizer.TT_NUMBER) {
num = "" + (int)st.nval;
JOptionPane.showMessageDialog(null,"Erreur1","Erreur",JOptionPane.ERROR_MESSAGE);
moment = 1;
}
else {
JOptionPane.showMessageDialog(null,
"Erreur2","Erreur",JOptionPane.ERROR_MESSAGE);
}
break;
case 1:
for (int i=0; i<4; i++) {
br.readLine();
moment = 1;
break;
}
moment = 2;
break;
case 2:
while ((tmp3 = br.readLine()) != num) {
tmp3 = br.readLine();
moment = 2;
}
br.close();
break;
}//fin switch
}//fin while
}//fin try
catch (Exception ex) {
JOptionPane.showMessageDialog(null,
"Erreur lors de la lecture vvp3 du fichier " +
f_atila.getName()+num,
"Erreur",
JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
return tmp3;
}//fin parse_vvp3


La compilation se lance sans erreur. Mais lorsque je passe à l'éxécution tout se passe comme si c'était une boucle infinie.
Je pense qu'en fait il ne récupère pas le bon "num" c'est-à-dire le 5520 ......
Qu'en penses-tu ?
La méthode pour récupérer les lignes te semble-t-elle bonne ?

Mille merci pour ton aide
0
cs_tigroux Messages postés 105 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 22 octobre 2008 16
5 août 2005 à 12:01
es ce normal que tu fais le premier br.readLine sans recuperer ce que tu lis.
Sinon as tu essayé d'affihcer le numero que tu récupere, en fait pour voir si tu as bien le "5520".
Ensuite ton
while ((tmp3 = br.readLine()) != num) {
tmp3 = br.readLine();
moment = 2;
}
ne pas fonctionner car tmp3 va contenir la ligne complete qui contient ton chiffre.
Il faut donc que tu regarde si ta ligne commence par num.
Moi je ferais ( c pas très propre on peux mieux faire mais bon):
tmp3 = br.readLine();
String tmp = tmp3.replaceAll(" ", ""); // Pour supprimer les blancs surtout ceux en début de ligne
while(tmp.startWith(num)) {
// Ici tu fais ce que tu dois puis
tmp3 = br.readLine();
tmp = tmp3.replaceAll(" ", "");
}
0
oncle jules Messages postés 43 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 19 septembre 2005
5 août 2005 à 13:38
Salut tigroux

C'est normal que je ne récupère rien avec le 1er readLine, c'est voulu car je souhaite sauter la 1ère ligne, pour récupérer le 1er chiffre de la seconde ligne. Mais hélas le numéro "num" que je récupère n'est effectivement pas le bon; je récupère en fait le 1er numéro de la 1ère ligne (i.e 11).
Est-ce que ca ne viendrait pas du fait que j'utilise à la fois du BufferedReader br et du StreamTokenizer st ??
Merci
0
oncle jules Messages postés 43 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 19 septembre 2005
5 août 2005 à 16:18
re
j'ai essayé avec le startWith mais j'ai une erreur à la compilation
cannot resolve symbol
symbol : method startWith (java.lang.String)
while(tmp.startWith(num)) {
^

je pensais qu'il fallait simplement que je rajoute dans l'entête du fichier
import java.lang.String

mais non, ce n'est pas aussi simple :/
0
oncle jules Messages postés 43 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 19 septembre 2005
5 août 2005 à 17:04
re re ;)
en fait c'est pas startWith mais startsWith
0
Rejoignez-nous