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#

  1. #1
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 933
    Points : 348
    Points
    348
    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 chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    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 éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 153
    Points : 7 403
    Points
    7 403
    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
    On ne jouit bien que de ce qu’on partage.

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

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    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 averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

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

  6. #6
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 933
    Points : 348
    Points
    348
    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

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

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    Par défaut
    Il faut que tu décales tes caractères vers la gauche, au lieu de simplement les remplacer par des espaces. Exemple avec :
    04 123456789 AA
    obtenir :
    04 34567 AA

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var line = "04 123456789 AA";
    var chars = line.ToCharArray();
    for(int i = 3; i < 8; ++i) chars[i] = chars[i+2];
    for(int i = 8; i < 12; ++i) chars[i] = ' ';

  8. #8
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Tu peut aussi faire des "Remove()" sur les indices que tu veux supprimer.
    Mais à ce moment, tu ne fais plus des remplacements de colonnes, mais des manipulations de chaînes.
    Ce sera dont probablement plus simple de faire des Concat() de Substring() et autre fonctions de chaînes.
    On ne jouit bien que de ce qu’on partage.

  9. #9
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 933
    Points : 348
    Points
    348
    Par défaut
    En parlant de cela, par rapport à ton pseudo StringBuilder, j'ai même tenté d'utiliser cette methode après avoir regardé sur le net, mais j'ai pas trop reussi.

    J'ai également vu les différentes opération dont tu parles : remove ou substring, mais là on manipule des string.
    En reprenant mon exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
                        chars[14] = ' ';  //enleve le 2
                        chars[13] = ' '; //enelve le 1
    si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    chars[13] = chars[13].ToString().Substring(0, 1).ToCharArray();
    substring pour couper l'espace de longueur 1 si je dis pas de bétise,
    tocharArray pour retransformer en char, mais j'ai un message d'erreur :
    impossible de convertir implicitement le type char[] en char.

  10. #10
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    RemoveAt() il faut le faire sur chars (probablement après l'avoir transformé en List<chars> car un array a une taille fixe), à l'index désiré : ça va supprimer le caractère purement et simplement. Quand tu vas reconstruire la chaîne, les caractères suivants seront donc décalés vers la gauche.

    Quant aux Concat() et Substring() il faut les faire en lieu et place de la manipulation du array de chars, directement sur la ligne.
    Ce sera plus lent et plus consommateur en mémoire, mais plus souple si la chaîne doit changer de taille.
    On ne jouit bien que de ce qu’on partage.

  11. #11
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 933
    Points : 348
    Points
    348
    Par défaut
    Bonjour j'ai finalement réussi , j'ai procédé comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                        chars[17] = chars[19];
                        chars[18] = chars[20];
                        chars[19] = chars[21];
                           .........
    j'ai déplacé les caractères et ça l'air de fonctionné , merci

+ 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