Copier une zone d'un fichier Txt [Résolu]

Signaler
Messages postés
22
Date d'inscription
lundi 14 juillet 2008
Statut
Membre
Dernière intervention
3 octobre 2011
-
Messages postés
22
Date d'inscription
lundi 14 juillet 2008
Statut
Membre
Dernière intervention
3 octobre 2011
-
Bonjour à tous,

je me lance dans la programmation et je cherche à résoudre un problème que j'ai rencontré cette semaine.

Contexte :
J'ai un fichier TXT de type fixe qui se découpe en 3 zones matérialisés par un numéro en début de ligne.

31:Entete (une seule ligne)
34:Corp du fichier(on peut avoir plusieurs ligne qui commencent par 34)
39:Fin du fichier (une seule ligne)

Je cherche à copier 12 dernières caractères de la ligne 39 sur les 12 derniers caractères de la ligne 31.

j'ai donc réussi a créer une fonction pour lire le fichier mais je ne sais pas comment programmer cette fonction

c'est pour cela que je fais appel à votre aide.

merci d'avance

31 réponses

Messages postés
22
Date d'inscription
lundi 14 juillet 2008
Statut
Membre
Dernière intervention
3 octobre 2011

j'ai une erreur d'accès au fichier, il me dit en plein traitement que le fichier et utilisé par un autre procéssus.
deuxieme problème il me vide mon fichier entierement.

dit moi WriteAllLines est ce vraiment necessaire car au final je n'ai besoin que de réécrire la premiere ligne de mon fichier.

voilà mon code merci encore de ta patience :D

   private void btn_Exec_Click_1(object sender, EventArgs e)
        {
            string[] lines = System.IO.File.ReadAllLines(Fichier);
            


            foreach (String l in lines)
            {


                if (l.StartsWith(fin))
                {

                    try
                    // toujours gérer des exceptions à partir du moment où on lit des données
                    {
                        // en C, on commence à 0, il faut donc commence à ire à prtir de la 228° position au lieu de la 229°
                        zone = l.Substring(228, 12);
                        txtData.Text = zone;
                    

                    }
                    catch (Exception ee)
                    {
                        // on ajoute dans la fenêtre de sortie le message de l'exception levée, ce qui permet de détecter l'anomalie précédente
                        txtData.AppendText(ee.Message.ToString());
                    }

                   
                }

                    // initialisation de l'écriture dans un fichier  
                StreamWriter ecrire = new StreamWriter(Fichier);
                if (l.StartsWith(debut))
                {
                    try
                    {

                        ligne1 = l.Substring(0, 227) + zone;
                        txtData.Text = ligne1;
                    }

                    catch (Exception ex)
                    {
                        // on ajoute dans la fenêtre de sortie le message de l'exception levée, ce qui permet de détecter l'anomalie précédente
                        txtData.AppendText(ex.Message.ToString());
                    }

                    ecrire.Close();
                }
            }

            
Messages postés
14788
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
1 mai 2021
155
Bonjour,

Réécrire tout le fichier est utile, car si tu changes les longueur de la première ligne, il faut déplacer tout le contenu du fichier.

Pour l'exception, as-tu ouvert le fichier ailleurs dans ton code ?

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Messages postés
22
Date d'inscription
lundi 14 juillet 2008
Statut
Membre
Dernière intervention
3 octobre 2011

je ne pense pas j'ai regardé le code j'ai bien closé le reader et le writer.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace WindowsFormsApplication3
{
    public partial class Ecran : Form
    {

        // variables globales--> horreur, Malheur, à proscrire

        // nom en dur : à proscrire ( utiliser le fichier de config de l'application )
        String Fichier ;
        String debut = "";
        String fin = "39";
        // ne samias laisser une variable initialisée
        String zone = "";
        String ligne1 = "";
        string linecount = "";

        public Ecran()
        {
            InitializeComponent();
        }


        private void BrnParcour_Click(object sender, EventArgs e)
        {


            OpenFileDialog Open = new OpenFileDialog();
            Open.Filter = "*.txt (Fichier Texte) |*.Txt";
            if (Open.ShowDialog() == DialogResult.OK)
            {

                StreamReader reader = new StreamReader(Open.FileName);
                txtData.Text = reader.ReadToEnd();
                // il faut mettre à jour la variable Fichier pour y déposer le fichier réellement choisi
                Fichier = Open.FileName;
               

                reader.Close();
            }
        }




        private void btn_Exec_Click_1(object sender, EventArgs e)
        {
            string[] lines = System.IO.File.ReadAllLines(Fichier);
            


            foreach (String l in lines)
            {


                if (l.StartsWith(fin))
                {

                    try
                    // toujours gérer des exceptions à partir du moment où on lit des données
                    {
                        // en C, on commence à 0, il faut donc commence à ire à prtir de la 228° position au lieu de la 229°
                       
                        
                        zone = l.Substring(228, 12);
                        txtData.Text = zone;
                    

                    }
                    catch (Exception ee)
                    {
                        // on ajoute dans la fenêtre de sortie le message de l'exception levée, ce qui permet de détecter l'anomalie précédente
                        txtData.AppendText(ee.Message.ToString());
                    }

                   
                }

                    // initialisation de l'écriture dans un fichier  
                StreamWriter ecrire = new StreamWriter(Fichier);
                if (l.StartsWith("31"))
                {
                    try
                    {
                    
                        ligne1 = l.Substring(0, 227) + zone;
                        txtData.Text = ligne1;
                        ecrire.WriteLine(ligne1);
                    }

                    catch (Exception ex)
                    {
                        // on ajoute dans la fenêtre de sortie le message de l'exception levée, ce qui permet de détecter l'anomalie précédente
                        txtData.AppendText(ex.Message.ToString());
                    }

                    ecrire.Close();
                }
            }

            
            


        }

        private void Ecran_Load(object sender, EventArgs e)
        {

        }
    }

}
Messages postés
22
Date d'inscription
lundi 14 juillet 2008
Statut
Membre
Dernière intervention
3 octobre 2011

mon erreur arrive à cette endroit

StreamWriter ecrire = new StreamWriter(Fichier);
                


il me dit donc que le fichier est utilisé par un autre procéssus et que l'exeption IOExeption n'a pas été géré.

une idée?
merci
Messages postés
14788
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
1 mai 2021
155
Bonjour,

Juste après ton StreamReader, je vois :
if (l.StartsWith("31"))

Et tu ferme le flux dans le If alors que le flux est ouvert hors de celui-ci, je pense donc que si ta condition est fausse, tu verrouilles le fichier définitivement.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Messages postés
14788
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
1 mai 2021
155
Dsl, *StreadWriter, pas Reader.
Messages postés
22
Date d'inscription
lundi 14 juillet 2008
Statut
Membre
Dernière intervention
3 octobre 2011

bon je seche

je me suis dit que si je passais par un fichier temporaire ca resolverai mon problème mais rien

voici mon code si ca peut aider.
private void btn_Exec_Click_1(object sender, EventArgs e)
        {
            string[] lines = System.IO.File.ReadAllLines(Fichier);
            


            foreach (String l in lines)
            {


                if (l.StartsWith(fin))
                {

                    try
                    // toujours gérer des exceptions à partir du moment où on lit des données
                    {
                        // en C, on commence à 0, il faut donc commence à ire à prtir de la 228° position au lieu de la 229°
                       
                        
                        zone = l.Substring(228, 12);
                        txtData.Text = zone;
                    

                    }
                    catch (Exception ee)
                    {
                        // on ajoute dans la fenêtre de sortie le message de l'exception levée, ce qui permet de détecter l'anomalie précédente
                        txtData.AppendText(ee.Message.ToString());
                    }

                  
 
                }
                string tmpfile = @"c:\tmp_moulinette.txt";
                StreamWriter ecrire = new StreamWriter(tmpfile);

                // initialisation de l'écriture dans un fichier  
                
                
                    if (l.StartsWith("31"))
                    {
                        try
                        {

                            ligne1 = l.Substring(0, 227) + zone;
                            txtData.Text = ligne1;
                            l.Replace("000000000000",ligne1);
                            ecrire.Flush();
                        }

                        catch (Exception ex)
                        {
                            // on ajoute dans la fenêtre de sortie le message de l'exception levée, ce qui permet de détecter l'anomalie précédente
                            txtData.AppendText(ex.Message.ToString());
                        }

                        ecrire.Close();

                        Fichier = tmpfile;
                    }
               
            }
Messages postés
14788
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
1 mai 2021
155
Bonjour,

Je reprend ton code :
                StreamWriter ecrire = new StreamWriter(tmpfile);

                // initialisation de l'écriture dans un fichier  
                
                
                    if (l.StartsWith("31"))
                    {
//...
                        ecrire.Close();

                        Fichier = tmpfile;
                    }


Si l.StartsWith("31") est faux, tu ne fermes pas ton flux, donc le fichier reste verouillé.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Messages postés
22
Date d'inscription
lundi 14 juillet 2008
Statut
Membre
Dernière intervention
3 octobre 2011

merci pour ton aide
c'etait donc bien le close qui n'était pas à la bonne place.

j'arrive au bout de mon projet.

j'ai bien en mémoire apparemment la variable 'zone' mais je n'arrive pas a trouver un moyen de réécrire le reste des lignes.
il m'écrit bien dans mon fichier tmp mais la meme ligne sans s'arreter :D
c'est pour ca que je voulais trouver un moyen de lui dire tu affiche la ligne 'l' et apres tu fais l++ mais c'est valable que pour les variables de type "int".

voici mon code

                string tmpfile = @"c:\tmp_moulinette.txt";
                StreamWriter ecrire = new StreamWriter(tmpfile);
     

                // initialisation de l'écriture dans un fichier  
                
                    if (lines[0]!=null);                     
                    {
                        try
                        {
                            // remplacer dans la ligne 1 la zone '00000....' par la variable "zone"
                          ligne1= l.Replace("000000000000",zone);
                            //affichage pour vérification
                            txtData.Text = ligne1;
                            
                            //ecriture de la ligne
                            ecrire.WriteLine(ligne1);
                            ecrire.Flush();
                        }

                        catch (Exception ex)
                        {
                            // on ajoute dans la fenêtre de sortie le message de l'exception levée, ce qui permet de détecter l'anomalie précédente
                            txtData.AppendText(ex.Message.ToString());
                        }
                 
               

                    }
                

                            ecrire.WriteLine(l);
                         
                        
                    ecrire.Close();

                   // Fichier = tmpfile;
            }
Messages postés
14788
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
1 mai 2021
155
Bonjour,

Utilises une boucle for ou Io.File.WriteAllLines

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Messages postés
22
Date d'inscription
lundi 14 juillet 2008
Statut
Membre
Dernière intervention
3 octobre 2011

hello,

j'y suis presque!!!

mon dernier problème est que mon fichier a 22 lignes et que lorsque je lui demande d'écrire les lignes il m'écrit 22 fois CHAQUE lignes.

voici ma commande de boucle for
je pense que je lui demande d'écrire des variables l1 alors que ma boucle for prend en compte la ligne avec un int alors si je fais i++ il pense que c'est l1*count donc 22 fois la ligne.
merci de ton aide

 
            string tmpfile = @"c:\tmp_moulinette.txt";
            StreamWriter ecrire = new StreamWriter(tmpfile);
            foreach (string l1 in lines)
            {
                if (l1.StartsWith(debut))
                {
                    // try
                    //  {
                    string zone1;
                    zone1 = l1.Substring(0, 227);
                    zone1 = zone1 + zone;
                    txtData.Text = zone1;
                    ecrire.WriteLine(zone1);
                }
                else
                {
                    int count = lines.Count();

                    for (int i = 1; i<count; i++)
                    {
                        ecrire.WriteLine(l1);
                        i++;
                    }
                }
            }
            ecrire.Close();
            }