Copier une zone d'un fichier Txt

Résolu
progscoubi Messages postés 22 Date d'inscription lundi 14 juillet 2008 Statut Membre Dernière intervention 3 octobre 2011 - 24 sept. 2011 à 20:30
progscoubi Messages postés 22 Date d'inscription lundi 14 juillet 2008 Statut Membre Dernière intervention 3 octobre 2011 - 30 sept. 2011 à 18:07
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

progscoubi Messages postés 22 Date d'inscription lundi 14 juillet 2008 Statut Membre Dernière intervention 3 octobre 2011
30 sept. 2011 à 18:07
c"est bon j'ai terminé de vous ennuyer (enfin pour ce projet) :D

j'ai enlevé la boucle for c'était inutile !

merci de votre aide & de votre patience

j'ai bien progressé
3
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
24 sept. 2011 à 22:47
Bonjour,

Tu peux voir avec le membres de String :
IndexOf, SubString, Length, ...

---------------------------------------------------------------------
[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
0
progscoubi Messages postés 22 Date d'inscription lundi 14 juillet 2008 Statut Membre Dernière intervention 3 octobre 2011
24 sept. 2011 à 23:06
merci de ta réponse je viens de regarder sur internet..
Existe t il une fonction équivalente a un Right() dans SQL

Je veux pas abuser mais pouvez vous me donner un exemple de bout de code a mettre après le buffereader

je ne suis pas développeur et je me lance tout doucement.

Encore merci pour votre aide.
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
25 sept. 2011 à 01:28
Bonjour,

Que vient faire SQL ici ?
Sinon, renseignes-toi sur les membres que je t'ai cités, je pense que tu as déjà de bonnes bases.

---------------------------------------------------------------------
[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
0

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

Posez votre question
progscoubi Messages postés 22 Date d'inscription lundi 14 juillet 2008 Statut Membre Dernière intervention 3 octobre 2011
25 sept. 2011 à 07:06
ok merci

je te parle de SQL car j'ai l'habitude de travailler sur SQL c'est juste pour ça.

j'ai regardé la fonction substring je vais m'en servir.

merci beaucoup
0
progscoubi Messages postés 22 Date d'inscription lundi 14 juillet 2008 Statut Membre Dernière intervention 3 octobre 2011
25 sept. 2011 à 09:55
je sèche pour le moment.
actuellement j'ai
un bouton pour chercher le fichier
une richtextbox pour afficher le texte lu en import

Première question :
Le fichier qui est afficher est il stocké en mémoire ?
si oui est ce que je peux lancer un StreamWriter pour rechercher la ligne 39 et appliquer la modif sur la ligne 31 ?

je ne vois pas comment je dois structurer mon code

je rappel que je suis un newbie en développement.

voilà ce que j'ai fais pour le moment.
merci
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
    {
        StreamReader Reader;

        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)
                {
                    Reader = new StreamReader(Open.FileName);
                    txtData.Text = Reader.ReadToEnd();
                    
                }


            
        }
    }
    
}
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
25 sept. 2011 à 13:06
Bonjour,

Tu ne fermes pas ton flux après usage.

Sinon, regardes du coté de System.Io.File.ReadAllLines, comme ça ce sera plus facile de traiter les lignes individuellement et sans avoir besoin d'un contrôle présent.

---------------------------------------------------------------------
[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
0
progscoubi Messages postés 22 Date d'inscription lundi 14 juillet 2008 Statut Membre Dernière intervention 3 octobre 2011
25 sept. 2011 à 18:03
voilà j'ai pris en compte des infos

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
{

String Fichier = @"C:\Prev.txt";
String debut = "31";
String fin = "39";

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();

reader.Close();
}
}

private void btrExec_Click(object sender, EventArgs e)
{
string[] lines = System.IO.File.ReadAllLines(Fichier);
foreach (String l in lines)
{
foreach (string l in debut){
Console.WriteLine(l.Substring(int 20));

}



}
}

}


j'ai essayé de faire une sélection en positionnant 2 variables "Debut" et "Fin"
mais je ne sais pas comment sélectionner les 2 lignes 31 et 39 pour apres y apporter des modifs.

la ligne FOREACH est en erreur c'est à cet endroit que je seche

encore merci de votre aide
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
25 sept. 2011 à 19:40
Bonjour,

Je ne comprend pas ta logique :
        private void btrExec_Click(object sender, EventArgs e)
        {
            string[] lines = System.IO.File.ReadAllLines(Fichier);
            foreach (String l in lines)
            { 
               foreach (string l in debut){
                   Console.WriteLine(l.Substring(int 20));

            }


Il faut que tu compares le début de la ligne, je ne vois pas pourquoi tu fais un foreach sur l'énumérateur de la chaine début (qui retourne un char en passant).

Pourquoi avoir mit "int 20" ?

Quand tu dis que tu as des erreurs, précises lesquelles.

---------------------------------------------------------------------
[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
0
progscoubi Messages postés 22 Date d'inscription lundi 14 juillet 2008 Statut Membre Dernière intervention 3 octobre 2011
25 sept. 2011 à 19:58
je voulais faire un "foreach" pour lui demande de lire chaque ligne qui à soit la variable "debut" soit la variable "fin"

mais je n'ai pas réussi a le faire.

Int 20 je pensais lui demander de m'afficher les 20 premiers caractères de la ligne. mais IHM m'a souligné '20))'

comment tu comparerai le début de ligne?

le foreach veut bien dire "pour chaque" non ?

ma logique était :" pour chaque ligne 'l' qui commence par 'debut' ou 'fin' tu affiches.

tu en pense que ma logique est erronée?
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
25 sept. 2011 à 22:01
Bonjour,

Pour tester le début d'une chaine :
String.StartWith(...)

As-tu lu l'aide de SubString ?

---------------------------------------------------------------------
[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
0
progscoubi Messages postés 22 Date d'inscription lundi 14 juillet 2008 Statut Membre Dernière intervention 3 octobre 2011
25 sept. 2011 à 22:04
merci, j'ai fais des recherches sur pas mal de site et testé pas mal de bout de code.

je vais me pencher sur Startwith.

bonne soirée
0
progscoubi Messages postés 22 Date d'inscription lundi 14 juillet 2008 Statut Membre Dernière intervention 3 octobre 2011
25 sept. 2011 à 22:22
Voilà j'ai suivit tes conseils.
si je clic sur le bouton il m'affiche toujours l'ensemble des lignes de mon fichier dans la console.
j'ai loupé quoi comme paramètre.


   private void btnExec_Click(object sender, EventArgs e)
        {
            string[] lines = System.IO.File.ReadAllLines(Fichier);
            foreach (String l in lines)
            {
                if (l.StartsWith(debut))
                {

                    Console.WriteLine(l);

                }

            }
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
25 sept. 2011 à 23:02
Bonjour,

As-tu regardé en pas à pas les valeurs des variables ainsi que les conditions ?

---------------------------------------------------------------------
[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
0
progscoubi Messages postés 22 Date d'inscription lundi 14 juillet 2008 Statut Membre Dernière intervention 3 octobre 2011
27 sept. 2011 à 07:48
Salut NHenry,

je viens de modifier mon code j'ai une erreur sur mon String(229,12) je veux lui dire qu'il doit mettre dans une variable "zone" déclarée au debut du code cette portion.
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
    {

        String Fichier = @"C:\Prev.txt";
        String debut = "31";
        String fin = "39";
        String zone;

        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();

                    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))
                {
                    zone = l.Substring(229, 12);
                    Console.WriteLine(zone);

                }

            }
            
        }
    }
    
}


j'apprécie grandement ta patience

merci beaucoup.
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
27 sept. 2011 à 09:15
Bonjour,

"j'ai une erreur sur"
Quelle erreur ?
Penses à toujours dire quelle erreur, ça aide pour la compréhension du problème.

Sinon, as-tu une chaine assez longue ?

Mon site
0
progscoubi Messages postés 22 Date d'inscription lundi 14 juillet 2008 Statut Membre Dernière intervention 3 octobre 2011
27 sept. 2011 à 20:09
j'ai bien avancé! j'arrive donc a isoler dans une variable Zone la valeur en question.

prochaine étape l'écriture dans un fichier.

tu me préconise quoi ? réécrire un nouveau fichier ou modifier le fichier qui est lu ?
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
27 sept. 2011 à 20:37
Bonjour,

Si tu conserve les lignes en tableaux, un Io.File.WriteAllLines serait bien plus simple.

Sinon à la place de :
StreamReader reader = new StreamReader(Open.FileName);
txtData.Text = reader.ReadToEnd();
reader.Close();

Un Io.File.ReadAllText serait bien plus intuitif.


---------------------------------------------------------------------
[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
0
progscoubi Messages postés 22 Date d'inscription lundi 14 juillet 2008 Statut Membre Dernière intervention 3 octobre 2011
27 sept. 2011 à 20:42
ok dis je bloque sur comment ajouter la zone mémorisée j'ai mis le code suivant mais je bloque sur la logique.

 }

                    // initialisation de l'écriture dans un fichier  
                StreamWriter ecrire = new StreamWriter(Fichier);
                if (l.StartsWith(debut))
                {
                    try
                    {
// mon but remplacer la premier ligne de mon fichier par la partie qui ne bouge pas sur cette ligne et je remplace la fin par la zone mémorisée.
                        ligne1 = l.Substring(0, 227) + zone;
                        

                    }


merci de ton aide
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
27 sept. 2011 à 20:50
Bonjour,

Essayes en concevant l'usage de ReadAllLines et WriteAllLines, et en ciblant une collection (List<...>) éventuellement.

---------------------------------------------------------------------
[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
0
Rejoignez-nous