Import de plusieurs fichiers txt dans la datagriview

Signaler
Messages postés
3
Date d'inscription
mercredi 13 janvier 2021
Statut
Membre
Dernière intervention
14 janvier 2021
-
Messages postés
15805
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 avril 2021
-
Bonjour,
Je suis en train de chercher comment importer plusieurs fichiers txt dans la datagriview pour en suite les enregistrer dans la base de données
Merci

6 réponses

Messages postés
15805
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 avril 2021
532
Bonjour

Tu crées une liste qui compile tous tes fichiers et tu bindes cette liste.
https://codes-sources.commentcamarche.net/faq/1291-utilisation-du-binding-au-travers-de-l-objet-databindingsource
Messages postés
3
Date d'inscription
mercredi 13 janvier 2021
Statut
Membre
Dernière intervention
14 janvier 2021

J'ai deux classes form et Helper
Je vous met le code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
 
namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        DataTable table = new DataTable();
 
        private void Form1_Load(object sender, EventArgs e)
        {
            
 
        }
 
        private void btn_import_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog1 = new OpenFileDialog
            {
                Title = "Parcourir le fichier",
                CheckFileExists = true,
                CheckPathExists = true,
                DefaultExt = "txt",
                Filter = "txt files (*.txt)|*.txt",
                FilterIndex = 2,
                RestoreDirectory = true,
                ReadOnlyChecked=true,ShowReadOnly=true,
            };
 
            if (openFileDialog1.ShowDialog()==DialogResult.OK)
            {
                foreach (string file in openFileDialog1.FileNames)
                {
                    textBox1.Text = openFileDialog1.FileName;
                    Helper.file = textBox1.Text;
                }
                
                dataGridView1.DataSource = Helper.DataTableFromTextFile(textBox1.Text);
            }
        }
 
        private void label1_Click(object sender, EventArgs e)
        {
 
        }
    }
}


using System ;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.IO;
 
namespace WindowsFormsApp1
{
    class Helper
    {
        public static string file;
        public static DataTable DataTableFromTextFile(string location,char delimiter='\t')
        {
            DataTable result;
            location = file;
            string[] linearay = File.ReadAllLines(location);
 
            result = FromDataTable(linearay, delimiter);
            return result;
        }
 
        private static DataTable FromDataTable(string[] linearay, char delimiter)
        {
            DataTable dt = new DataTable();
            AddCoulumnToTable(linearay, delimiter,ref dt);
            AddRowToTable(linearay, delimiter, ref dt);
            return dt;
        }
 
        private static void AddRowToTable(string[] Values, char delimiter, ref DataTable dt)
        {
            for (int i = 0; i < Values.Length; i++)
            {
                string[] valeurs = Values[i].Split(delimiter);
                DataRow dr = dt.NewRow();
                for (int j = 0; j < valeurs.Length; j++)
                {
                    dr[j] = valeurs[j];
                }
                dt.Rows.Add(dr);
            }
        }
 
        private static void AddCoulumnToTable(string[] columnCollectioi, char delimiter, ref DataTable dt)
        {
            string[] colones = columnCollectioi[0].Split(delimiter);
            foreach (string columnName  in colones)
            {
                DataColumn dc = new DataColumn();
                dt.Columns.Add(dc);
            }
        }
    }
}


Avec ce code j'arrive qu'afficher le contenu d'un seul fichier les autres ne s'affiche pas
Messages postés
15805
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 avril 2021
532
Merci d’avoir essayé d’utiliser les balises de code.
Pour une meilleure présentation, merci de lire attentivement ce tuto https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code


Ici
                foreach (string file in openFileDialog1.FileNames)
                {
                    textBox1.Text = openFileDialog1.FileName;
                    Helper.file = textBox1.Text;
                }


Dans le tableau de chemin, tu prends le premier, tu le mets dans le textbox. Puis tu prends le second, que tu mets à la place du premier dans le textbox. Puis tu prends le troisième que tu mets à la place du second etc...

A la fin, le textbox contient le dernier fichier.
Je ne suis pas allé plus loin, ce n’est peut-être pas le seul problème.
Messages postés
15805
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 avril 2021
532
Maintenant que @karamel a corrigé ta coloration syntaxique, j’ai regardé ta classe helper.
D’une part elle est conçue pour un seul fichier.
D’autre part elle utilise un DataTable, c’est un outil que je n’aime pas parce qu’il n’est pas aussi souple que d’autres outils fournis par C#. Les rares fois où j’utilise des bases de données je tache toujours de faire sans, donc je ne sais pas te dire si on peut facilement mettre bout à bout le contenu de plusieurs fichiers (alors qu’avec une liste comme je te l’ai proposé dès le début c.est simple comme Bonjour).
En plus un datatable pour lire un fichier texte, c’est comme tirer au canon sur une mouche...

Si tu le souhaites, je peux te faire un petit exemple avec une liste et deux petits fichiers.
Messages postés
15805
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 avril 2021
532
PS pense à remercier @karamel pour son intervention
Messages postés
3
Date d'inscription
mercredi 13 janvier 2021
Statut
Membre
Dernière intervention
14 janvier 2021

Merci beaucoup @Whismeril tu peux le faire pour deux fichiers histoire de comprendre un peu comment ça marche.
@Karamel, merci pour la correction
Messages postés
15805
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 avril 2021
532
Si j’ai un peu de temps dans la soirée sinon demain soir
Messages postés
15805
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 avril 2021
532
Je pars du principe que tu as lu le tuto que je t'ai mis en lien hier.

Alors on a 2 fichiers avec la même structure:
  • Une ligne d'entête
  • 3 colonnes séparées par une tabulation
    • une de nombres entiers
    • une de texte
    • une de date


Col1	Col2	Col3
1	Nom 1	01/02/2018
2	Nom 2	03/04/2019
3	Nom 3	05/06/2020


et

Entier	Nom	Date
4	Nom 4	07/08/2018
5	Nom 5	09/10/2019
6	Nom 6	11/12/2020


Comme je te l'ai dit plus haut, on écrit une classe qui correspond à ces enregistrements

    public class ExempleEvaka : INotifyPropertyChanged
    {
        #region INotifyPropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;

        private void GenerePropertyChanged(params string[] Proprietes)
        {
            if (this.PropertyChanged != null)
                foreach(string p in Proprietes)
                    PropertyChanged(this, new PropertyChangedEventArgs(p));
        }

        #endregion

        /// <summary>
        /// Constructeur de la classe
        /// </summary>
        /// <param name="Nombre"></param>
        /// <param name="LeNom"></param>
        /// <param name="LaDate"></param>
        public ExempleEvaka(int Nombre, string LeNom, DateTime LaDate)
        {
            Nom = LeNom;
            Entier = Nombre;
            Date = LaDate;
        }

        #region Propriétés
        private int entier;
        /// <summary>
        /// Nombre entier
        /// </summary>
        public int Entier
        {
            get { return entier; }
            set
            {
                if (entier != value)
                {
                    entier = value;
                    GenerePropertyChanged("Entier");
                }
            }
        }

        private string nom;
        /// <summary>
        /// Nom
        /// </summary>
        public string Nom
        {
            get { return nom; }
            set
            {
                if (nom != value)
                {
                    nom = value;
                    GenerePropertyChanged("Nom");
                }
            }
        }

        private DateTime date;
        /// <summary>
        /// Date
        /// </summary>
        public DateTime Date
        {
            get { return date; }
            set
            {
                if (date != value)
                {
                    date = value;
                    GenerePropertyChanged("Date");
                }
            }
        }
        #endregion
    }


et là le code, qui, à partir d'un tableau de chemins de fichiers, lit, concatène et affiche les contenus
            string[] filenames = { Path.Combine(Application.StartupPath, "Fichier 1.txt"), Path.Combine(Application.StartupPath, "Fichier 2.txt") }; //simule la sélection des 2 fichiers dans un openfiledialog

            List<ExempleEvaka> maListe = new List<ExempleEvaka>();

            foreach(string fichier in filenames)//on itère chaque chemin
                foreach(string ligne in File.ReadAllLines(fichier).Skip(1)) // on itérèe chaque ligne du fichier correspondant, sauf la première
                {
                    string[] valeurs = ligne.Split('\t'); //on découpe la ligne
                    int nombre = Convert.ToInt32(valeurs[0]); //on convertit les données
                    DateTime date = Convert.ToDateTime(valeurs[2]);

                    maListe.Add(new ExempleEvaka(nombre, valeurs[1], date)); //on ajoute un enregistrement à la liste
                }

            exempleEvakaBindingSource.DataSource = maListe;



Ensuite, pour remplir la base de données, c'est à partir de la liste qu'il faut le faire, le champ de type entier et le champ de type DateTime sont déjà dans ces types.