IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Modifier un fichier texte


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2013
    Messages
    976
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 976
    Par défaut Modifier un fichier texte
    Bonjour ,

    je fais un petit programme c# dans lequel j'ai un fichier texte en entrée et je souhaite modifier une colonne de ce fichier puis sauvegarder le résultat mais j'ai du mal, voici mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
     private void Btnenvoyer_Click(object sender, EventArgs e)
            {
                StreamReader sr = new StreamReader(txtfichiersource.Text);
                vue1.Text = sr.ReadLine().ToString(); //ici c'est une test pour voir si je recupère lal igne
     
     
                string[] lines = System.IO.File.ReadAllLines(txtfichiersource.Text);
     
     
                foreach (string line in lines)
                {
     
     
                    vue2.Text = lines[1].ToString();
                }
     
     
                }
        }
    dans mon fichier joint, j'aimerais modifié tous les 05 par 25 , sans que mon fichier ne subisse de modification quelconque.

    Mon but est de pouvoir renseigner un fichier, qui fais par exemple 1000 ligne et remplacer la colonne 1 et 2 (donc 15 par 25) et la colonne 13,14,15 (000 par 111) , en gardant le fichier en l'état.

    Merci pour vos conseils.

  2. #2
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Ta demande n'est pas très claire sur le détail, mais sur le principe général le plus simple est probablement de faire le modèle de données correspondant à ton fichier, de le charger à partir du fichier, de faire les modifications dans ton modèle (comme ça se sera fait de façon contrôlée) puis de sérialiser ton modèle dans le fichier.

  3. #3
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Voici un petit exemple :
    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    using System;
    using System.IO;
     
    namespace ReplaceTextFileColumns
    {
        public static class Exemple
        {
            const string FILE_IN = "c:\\in\\text.in";
            const string FILE_OUT = "c:\\in\\text.out";
     
            public static void Run()
            {
                using (TextReader tr_in = File.OpenText(FILE_IN))
                {
                    using (TextWriter tr_out = File.CreateText(FILE_OUT))
                    {
                        char[] chars = new char[0];
     
                        while ((chars = tr_in.ReadLine()?.ToCharArray())?.Length > 0 && chars != null)
                        {
                            if (chars.Length >= 16 && chars[1] == '1' && chars[2] == '5' && chars[13] == '0' && chars[14] == '0' && chars[15] == '0')
                            {
                                chars[1] = '2';
                                //chars[2] = '5'; -- inutile, c'est déjà 5...
     
                                chars[13] = '1';
                                chars[14] = '1';
                                chars[15] = '1';
                            }
                            else
                            {
                                tr_out.Close();
                                tr_in.Close();
                                File.Delete(FILE_OUT);
                                throw new InvalidDataException("Le fichier d\'origine contient des données incohérentes");
                            }
     
                            tr_out.WriteLine(chars);
                        }
     
                        tr_out.Close();
                        tr_in.Close();
                    }
                }
            }
        }
    }

    text.in
    c15eci est un000 test
    c15eci est un000 test
    c15eci est un000 test
    c15eci est un000 test
    c15eci est un000 test
    c15eci est un000 test
    c15eci est un000 test
    Ce qui produit
    text.out
    c25eci est un111 test
    c25eci est un111 test
    c25eci est un111 test
    c25eci est un111 test
    c25eci est un111 test
    c25eci est un111 test
    c25eci est un111 test

  4. #4
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    J'ai pris un peu de temps pour faire un exemple. Je ne sais pas ce que tu traites comme données mais j'ai pris le parti d'un fichier avec une liste d'articles en stock, de ce format :
    <référence produit sur 9 caractères><tabulation><désignation de produit sans tabulation ni saut de ligne><tabulation><nombre d'items en stock (entier)>

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    000000123	Produit 1	10
    000AAA123	Produit 2	12
    000123CCC	Produit 3	4
    Classe de produit (avec parsing et ToString() custom pour sérialiser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    public class Product
        {
            public string Reference { get; set; }
            public string Name { get; set; }
            public int Stock { get; set; }
     
            public static Product Parse(string s)
            {
                var values = s.Split('\t');
                return new Product
                {
                    Reference = ValidateReference(values[0]),
                    Name = values[1],
                    Stock = int.Parse(values[2])
                };
            }
     
            private static string ValidateReference(string s)
            {
                if (s.Length != 9) throw new FormatException("Invalid product reference format");
                return s;
            }
     
            private static string ValidateName(string s)
            {
                var invalid = new[] { '\t', '\r', '\n' };
                if (s.Any(c => invalid.Contains(c))) throw new FormatException("Invalid product name format");
                return s;
            }
     
            public override string ToString() => $"{Reference}\t{Name}\t{Stock}";
        }
    Classe de Stock qui gère la collection de produits (avec parsing et ToString() custom ; implémente IList<Product>) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    public class Stock : IList<Product>
        {
            private List<Product> _products = new List<Product>();
     
            public Product this[int index] { get => _products[index]; set => _products[index] = value; }
     
            public int Count => _products.Count;
     
            public bool IsReadOnly => false;
     
            public static Stock Parse(string s)
            {
                var products = s.Split('\n', StringSplitOptions.RemoveEmptyEntries).Select(_s => Product.Parse(_s)).ToList();
                var stock = new Stock();
                stock._products = products;
                return stock;
            }
     
            public void Add(Product item) => _products.Add(item);
     
            public void Clear() => _products.Clear();
     
            public bool Contains(Product item) => _products.Contains(item);
     
            public void CopyTo(Product[] array, int arrayIndex) => _products.CopyTo(array, arrayIndex);
     
            public IEnumerator<Product> GetEnumerator() => _products.GetEnumerator();
     
            public int IndexOf(Product item) => _products.IndexOf(item);
            public void Insert(int index, Product item) => _products.Insert(index, item);
     
            public bool Remove(Product item) => _products.Remove(item);
     
            public void RemoveAt(int index) => _products.RemoveAt(index);
     
            public override string ToString() =>
                new StringBuilder()
                .AppendJoin("\n", _products.Select(p => p.ToString()))
                .ToString();
     
            IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
        }
    Le programme, qui modifie la référence du premier article :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Hello World!");
                var filePath = "stock.txt";
                var content = File.ReadAllText(filePath);
                Console.WriteLine("File loaded");
                var stock = Stock.Parse(content);
                Console.WriteLine($"{stock.Count} products in store");
                stock[0].Reference = "123123123";
                File.WriteAllText(filePath, stock.ToString());
            }
        }
    Le fichier résultat, avec la référence à jour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    123123123	Produit 1	10
    000AAA123	Produit 2	12
    000123CCC	Produit 3	4

  5. #5
    Membre éprouvé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2013
    Messages
    976
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 976
    Par défaut
    merci à vous, vos exemples me semble très bien ,je suis en train de regarder cela

  6. #6
    Membre éprouvé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2013
    Messages
    976
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 976
    Par défaut
    j'ai tenté cette manipulation, d'après Stringbuilder, ça marche super bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
                barre.Maximum = 100;
                barre.Minimum = 0;
                barre.Step = 1;
     
                 string sortie= @"C:\........\destination.txt";
     
                StreamReader sr = new StreamReader(txtfichiersource.Text);
                StreamWriter sw = new StreamWriter(sortie);
     
                char[] chars = new char[0];
     
     
     
                while ((chars = sr.ReadLine()?.ToCharArray())?.Length > 0 && chars != null)
                {
                    if (chars.Length >= 16 && chars[0] == '0' && chars[1] == '4')
                    {
                        chars[1] = '5';
                          //je supprime la lettre
                         chars[20] = ' ';
                    }
                    else
                    {
                        sw.Close();
                        sr.Close();
                        File.Delete(sortie);
     
                    }
     
                    string line = sr.ReadLine().ToString();
     
                   line = line.Remove(19);
                    sw.WriteLine(chars);
     
     
     
                    barre.PerformStep();
                }
                sw.Close();
                sr.Close();
     
                MessageBox.Show("Traitement Terminé");

    je tente de supprimé plusieurs colonne mais je n'y arrive pas.
    Lorsque je fais :
    je vais supprimé la lettre dans là où j'ai mes identifiants, tout en respectant le nombre de colonne dans le fichier.
    ex:
    avant :
    04 1234567E

    après:
    04 1234567

    Lorsque je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                        chars[14] = ' ';  //enleve le 2
                        chars[13] = ' '; //enelve le 1
     
    chars[13] = ' '; //fait disparaitre le E
    je souhaite faire disparaitre les 2 premiers chiffre du numéro
    ex: avant
    04 1234567E

    après :
    04 34567

    mais le soucis avec ça c'est que je n'ai plus le même nombre de colonne, en gros il disparaisse mais ce que je souhaite faire c'est que le chiffre 34567 vienne en position initial ( à la colonne du 1 de l'identifiant 1234567E)
    je dois pas être loin mais j'ai du mal, auriez vous une idée ?

    Merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA-E] modifier un fichier texte avant import
    Par hka75 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 04/04/2007, 21h13
  2. modifier un fichier texte
    Par gennydude99 dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 20/10/2006, 22h54
  3. [vb.net] Modifier un fichier texte
    Par olbi dans le forum Windows Forms
    Réponses: 2
    Dernier message: 06/10/2006, 15h31
  4. Réponses: 3
    Dernier message: 06/10/2006, 14h21
  5. comment utiliser Notepad pour modifier un fichier texte?
    Par moon13_698 dans le forum Autres Logiciels
    Réponses: 7
    Dernier message: 06/05/2006, 15h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo