Import de plusieurs fichiers txt dans la datagriview

Evaka_2037 Messages postés 3 Date d'inscription mercredi 13 janvier 2021 Statut Membre Dernière intervention 14 janvier 2021 - 13 janv. 2021 à 07:09
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 - 14 janv. 2021 à 21:47
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

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
13 janv. 2021 à 07:21
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
0
Evaka_2037 Messages postés 3 Date d'inscription mercredi 13 janvier 2021 Statut Membre Dernière intervention 14 janvier 2021
Modifié le 13 janv. 2021 à 18:07
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
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
13 janv. 2021 à 16:35
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.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
14 janv. 2021 à 08:20
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.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
14 janv. 2021 à 08:20
PS pense à remercier @karamel pour son intervention
0
Evaka_2037 Messages postés 3 Date d'inscription mercredi 13 janvier 2021 Statut Membre Dernière intervention 14 janvier 2021
14 janv. 2021 à 10:29
Merci beaucoup @Whismeril tu peux le faire pour deux fichiers histoire de comprendre un peu comment ça marche.
@Karamel, merci pour la correction
0

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

Posez votre question
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
14 janv. 2021 à 12:48
Si j’ai un peu de temps dans la soirée sinon demain soir
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
14 janv. 2021 à 21:47
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.
0
Rejoignez-nous