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

progscoubi 22 Messages postés lundi 14 juillet 2008Date d'inscription 3 octobre 2011 Dernière intervention - 24 sept. 2011 à 20:30 - Dernière réponse : progscoubi 22 Messages postés lundi 14 juillet 2008Date d'inscription 3 octobre 2011 Dernière intervention
- 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
Afficher la suite 

31 réponses

Répondre au sujet
progscoubi 22 Messages postés lundi 14 juillet 2008Date d'inscription 3 octobre 2011 Dernière intervention - 30 sept. 2011 à 18:07
+3
Utile
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é
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de progscoubi
NHenry 14128 Messages postés vendredi 14 mars 2003Date d'inscription 16 avril 2018 Dernière intervention - 24 sept. 2011 à 22:47
0
Utile
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
Commenter la réponse de NHenry
progscoubi 22 Messages postés lundi 14 juillet 2008Date d'inscription 3 octobre 2011 Dernière intervention - 24 sept. 2011 à 23:06
0
Utile
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.
Commenter la réponse de progscoubi
NHenry 14128 Messages postés vendredi 14 mars 2003Date d'inscription 16 avril 2018 Dernière intervention - 25 sept. 2011 à 01:28
0
Utile
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
Commenter la réponse de NHenry
progscoubi 22 Messages postés lundi 14 juillet 2008Date d'inscription 3 octobre 2011 Dernière intervention - 25 sept. 2011 à 07:06
0
Utile
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
Commenter la réponse de progscoubi
progscoubi 22 Messages postés lundi 14 juillet 2008Date d'inscription 3 octobre 2011 Dernière intervention - 25 sept. 2011 à 09:55
0
Utile
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();
                    
                }


            
        }
    }
    
}
Commenter la réponse de progscoubi
NHenry 14128 Messages postés vendredi 14 mars 2003Date d'inscription 16 avril 2018 Dernière intervention - 25 sept. 2011 à 13:06
0
Utile
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
Commenter la réponse de NHenry
progscoubi 22 Messages postés lundi 14 juillet 2008Date d'inscription 3 octobre 2011 Dernière intervention - 25 sept. 2011 à 18:03
0
Utile
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
Commenter la réponse de progscoubi
NHenry 14128 Messages postés vendredi 14 mars 2003Date d'inscription 16 avril 2018 Dernière intervention - 25 sept. 2011 à 19:40
0
Utile
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
Commenter la réponse de NHenry
progscoubi 22 Messages postés lundi 14 juillet 2008Date d'inscription 3 octobre 2011 Dernière intervention - 25 sept. 2011 à 19:58
0
Utile
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?
Commenter la réponse de progscoubi
NHenry 14128 Messages postés vendredi 14 mars 2003Date d'inscription 16 avril 2018 Dernière intervention - 25 sept. 2011 à 22:01
0
Utile
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
Commenter la réponse de NHenry
progscoubi 22 Messages postés lundi 14 juillet 2008Date d'inscription 3 octobre 2011 Dernière intervention - 25 sept. 2011 à 22:04
0
Utile
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
Commenter la réponse de progscoubi
progscoubi 22 Messages postés lundi 14 juillet 2008Date d'inscription 3 octobre 2011 Dernière intervention - 25 sept. 2011 à 22:22
0
Utile
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);

                }

            }
Commenter la réponse de progscoubi
NHenry 14128 Messages postés vendredi 14 mars 2003Date d'inscription 16 avril 2018 Dernière intervention - 25 sept. 2011 à 23:02
0
Utile
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
Commenter la réponse de NHenry
progscoubi 22 Messages postés lundi 14 juillet 2008Date d'inscription 3 octobre 2011 Dernière intervention - 27 sept. 2011 à 07:48
0
Utile
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.
Commenter la réponse de progscoubi
NHenry 14128 Messages postés vendredi 14 mars 2003Date d'inscription 16 avril 2018 Dernière intervention - 27 sept. 2011 à 09:15
0
Utile
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
Commenter la réponse de NHenry
progscoubi 22 Messages postés lundi 14 juillet 2008Date d'inscription 3 octobre 2011 Dernière intervention - 27 sept. 2011 à 20:09
0
Utile
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 ?
Commenter la réponse de progscoubi
NHenry 14128 Messages postés vendredi 14 mars 2003Date d'inscription 16 avril 2018 Dernière intervention - 27 sept. 2011 à 20:37
0
Utile
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
Commenter la réponse de NHenry
progscoubi 22 Messages postés lundi 14 juillet 2008Date d'inscription 3 octobre 2011 Dernière intervention - 27 sept. 2011 à 20:42
0
Utile
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
Commenter la réponse de progscoubi
NHenry 14128 Messages postés vendredi 14 mars 2003Date d'inscription 16 avril 2018 Dernière intervention - 27 sept. 2011 à 20:50
0
Utile
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
Commenter la réponse de NHenry

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Copier une zone d'un fichier Txt - page 2