none
Lecture fichier CSV et intégration données dans dictionnaire RRS feed

  • Discussion générale

  • Bonjour,

    Je dois lire un fichier CSV pour récupérer les données qui s'y trouve afin de les insérer ou non dans un dictionary<string,Dictionary<Guid, string>>.

    Voici la structure de mon fichier CSV (par exemple):

    GUID|FR|EN|DE|NL|ES
    9530393e-330f-4987-80e1-62e152943271|Bonjour|Hello|Hallo||
    4ff6a5b3-514f-4aba-8332-29811bf74333|Aurevoir||||
    436c5760-97f6-45a1-b006-aeb42bd3494f|Fin||||

    Mon dictionnaire aura la structure suivante (ici):

    FR, 9530393e-330f-4987-80e1-62e152943271, Bonjour
    EN, 9530393e-330f-4987-80e1-62e152943271, Hello                                                                                                                                                                 DE, 9530393e-330f-4987-80e1-62e152943271, Hallo                                                                                                                                                                  NL, 9530393e-330f-4987-80e1-62e152943271, 
    ES, 9530393e-330f-4987-80e1-62e152943271, 
    FR,4ff6a5b3514f4aba833229811bf74333, Aurevoir                                                                                                                                                                                                          etc...

    Ma question est donc : comment récupérer les données d'un fichier CSV, puis les comparer avec un dictionnaire afin de les y insérer si la valeur est vide ?

    Par exemple ici, Il faut que je regarde si à ma clé "FR", toutes les values correspondant à la clé "9530393e-330f-4987-80e1-62e152943271" sont renseignées, et si non, regarder si il y une nouvelle valeur dans le fichier CSV correspondant à cette clé pour ainsi l'insérer dans le dictionnaire.

    Merci

     

    mercredi 20 juillet 2011 12:30

Toutes les réponses

  • Bonjour,

    La première étape est de lire le fichier CSV

    Soit vous écrivez votre fonction pour les lire les lignes soit vous utilisez une méthode déjà écrite comme celle-ci

    Ensuite il faut boucler sur le tableau de chaque ligne pour voir si l'entrée existe dans le dictionnaire ou bien l'ajouter comme ceci:

    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    
    namespace cs_dico
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
          Dictionary<string, int> dico = new Dictionary<string, int>();
          dico.Add("chaine1", 2);
          dico.Add("chaine2", 5);
          dico.Add("chaine3", 21);
          dico.Add("chaine11", 32);
          dico.Add("chaine101", 102);
          foreach (var item in dico)
          {
          MessageBox.Show("La clef est: " + item.Key + " et la valeur est: " + item.Value.ToString());
          }
        }
    
        private bool InDico(Dictionary<string, int> dico2, string chaine2)
        {
          bool itIsInDico = false;
          foreach (var item in dico2)
          {
            if (dico2.ContainsKey(chaine2))
            {
              itIsInDico = true;
              break;
            }
          }
          return itIsInDico;
        }
      }
    }
    



    fred
    mercredi 20 juillet 2011 12:49
  • Bonjour,

    J'ai écris un compteur de mot dont vous pouvez vous inspirer:

    ArrayList lines = new ArrayList();
          Dictionary<string, int> dico = new Dictionary<string, int>();
          StreamReader sr = new StreamReader("C:\\fichier.txt");
          while (sr.Peek() > -1)
            {
               lines.Add (sr.ReadLine());
            }
          sr.Close();
          lines.TrimToSize();
          foreach (string line in lines)
            {
              //Console.WriteLine(line);
              string[] split = line.Split(new Char[] { ' ', '\t' });
              foreach (string mot in split)
               {
                if (dico.ContainsKey(mot))
                 {
                  if (( mot.Trim() != "") && (mot.Length > 0))
                   {
                    dico[mot]++;
                   }
                 }
                else
                 {
                  dico.Add(mot,1);
                 }
              }
            }
          StreamWriter sw = new StreamWriter("C:\\result.txt");
          foreach (var item in dico)
           {
            //Console.WriteLine(item.Key + " appears " + item.Value + " times");
            sw.WriteLine(item.Key + "," + item.Value);
           }
          sw.Close();
    



    fred
    mercredi 20 juillet 2011 13:02
  • Le constructeur IEqualityComparer sert à la comparaison
    mercredi 20 juillet 2011 18:25
  • Bonjour 


    Est-ce que vous avez pu progresser avec les solutions proposées ? Merci de tenir la communauté informée de la suite de vos démarches.


    Cordialement
    lundi 25 juillet 2011 11:45
    Modérateur