Partage
  • Partager sur Facebook
  • Partager sur Twitter

Récupération et stockages de texte d'une page web

    20 juin 2020 à 8:26:48

    Salut ! Voilà, ça faisait un moment que j'avais un projet en tête, je profite des vacances scolaire pour le commencer. Je suis un gros fan des jeux pokémon et en particulier de la stratégies et du "shinyhunting" (activité qui consiste à chercher des pokémon rare). Pour m'aider dans la pratique de ces activités, j'utilise au quotidien des sites, applications, ect afin de réaliser diverse opération mathématique (calcule de dégâts, manipulation de la rng, calcule de statistique, de probabilité et j'en passe). Mon projets consiste à tout regrouper dans une seule et unique interface winForm. Voilà pour le contexte. Seulement voilà, je me heurte à 2 problèmes:

    1) Pour réaliser ces calcules, il faut résoudre des équations dont les paramètres sont des valeurs liés aux jeux. Statistiques de PV, Attaque, Defence..., niveau d'évolutions, évolutions potentielle, liste des capacités, niveau d’apprentissage de celle-ci sans oublié les données utiles à la lisibilité comme le Nom de la bestiole ou son ID de pokédex, j'en passe. Tout ça pour les plus de 800 espèces que contiennent les jeux, ça fait beaucoup de données. Aussi, ma question est la suivante: Existe t-il un moyen de stocker ces données (en local de préférence) permettant à une application de les retrouver facilement pour s'en servir. Actuellement j'utilise un document .txt et je récupère chaque ligne dans un tableau de string puis je me débrouille avec mais je me dit que la tache va commencer à être compliqué quand le nombres de données deviendra plus conséquent. Je précise que l'application et réservé à mon usage personnel et que le faite que le fichier dans lequel je stock mes données soit modifiable ne me dérange pas.

    2) La quantité de données à récolter est énorme. Il n'est clairement pas envisageable de tout taper à la main. Je cherche donc un moyen de récupérer ces informations à l'aide d'une application console depuis les wikis dédiés à pokémons afin de les écrire dans les fichiers correspondant. Pour le moment j'ai réussi à automatiser la récupération de tout les noms des pokémons ainsi que leurs ID en téléchargent le code source d'une page web que j'ai mis dans une string. En récupérent le tableau contenant les noms et ID des pokémons et en le découpant j'ai réussi à récupérer ce que je voulais. Mais cette solutions à ces limites. Déja je dois adapter mon code à chaque fois que je cherche une nouvelle donnée mais si en plus le tableau se paye le luxe de fusionner des cellules et d'en diviser d'autres, ça devient un enfer. Sans parler du fait que si les données ne sont pas dans un tableau, ma méthode ne sert à rien. Je cherche donc une solutions plus efficace pour récupérer ces informations.

    Merci à tout ceux qui on pris la peine de me lire et ceux qui prendront la peine de m'aider :)

    -
    Edité par Tigreleonne 20 juin 2020 à 8:27:15

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      20 juin 2020 à 19:13:17

      Salut !

      J'ai ce qu'il te faut :) 

      Tu cherches à ce qu'on appelle "serializer des données".

      Je vais te faire une liste d'étape à suivre :

      Etape 1 : crée une classe "Resource". Je t'invite à prendre celle ci :

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace test // Change avec le nom de ton namespace
      {
          public class Resource
          {
      
          }
      }

      Etape 2 : Crée une classe Utilities. Je t'invite à copier coller ce code là :

      using Newtonsoft.Json;
      using System;
      using System.Collections.Generic;
      using System.Drawing;
      using System.IO;
      
      namespace test // Change avec ton namespace
      {
          public class Utilities
          {
              public static string resourcesPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\NOM_ENTREPRISE\NOM_LOGICIEL";
      
      
              public Resource resource = new Resource();
      
              /// <summary>
              /// Initialize toutes les resources
              /// </summary>
              public void InitializeResourcesPath()
              {
                  Directory.CreateDirectory(resourcesPath);
                  resourcesPath += @"\resources.zdt";
      
                  if (!File.Exists(resourcesPath))
                  {
                      File.Create(resourcesPath).Close();
                  }
              }
      
              /// <summary>
              /// Charge les resources
              /// </summary>
              public void LoadResources()
              {
                  string json = File.ReadAllText(resourcesPath);
                  resource = JsonConvert.DeserializeObject<Resource>(json);
      
                  if (resource == null)
                  {
                      resource = new Resource();
                  }
              }
      
              /// <summary>
              /// Sauvegarde les resources
              /// </summary>
              public void SaveResources()
              {
                  File.WriteAllText(resourcesPath, JsonConvert.SerializeObject(Main.Utilities.resource, Formatting.Indented));
              }
          }
      }


      Attention ! N'oublie pas de changer dans "resourcesPath" : "NOM_ENTREPRISE" avec le nom de ton entreprise (ou juste ton pseudo ou comme tu veux mais dans toutes tes applications il faudra que ce soit le même nom. Et "NOM_LOGICIEL" avec le nom du logiciel que tu crées

      Il faut aussi changer dans la fonction "SaveResources", entre les deux parenthèse le "Main" par le nom de ta forme/fenêtre. Une fois cela fait, fait clic droit sur "Utilities" (qui est souligné en rouge) -> Actions rapides et réfactorisation -> Généré la variable "Utilities" -> Générer la propriété "X.Utilities".

      Après avoir suivit le texte juste au dessus, retourne sur ta forme/fenêtre où a été généré la variable Utilities et change, dans la ligne qui a été ajouté "object" en "Utilities" (nom de la classe) et " { get; internal set; }" en " = new Utilities();".


      Si tu es sur Visual Studio, tu peux faire un clic droit en bas de la classe Utilities, la ou c'est surligner en rouge, plus précisément sur "JsonConvert". Donc clic droit -> Actions rapides et réfactorisation -> Installer le package "Newstonsoft.Json". C'est le package officiel de Json que tu dois surement connaitre.

      Etape 3 : 

      Dans l'initialisateur de ta forme/fenetre ajoute : 


              public MainWindow()
              {
                  InitializeComponent(); 
      
                  Utilities.InitializeResourcesPath();
                  Utilities.LoadResources();
      
                  this.Closed += new EventHandler(WindowsClosed);
              }
      
              /// <summary>
              /// Sauvegarde les resources
              /// </summary>
              /// <param name="sender"></param>
              /// <param name="e"></param>
              private void WindowsClosed(object sender, EventArgs e) // Ajoute aussi ça
              {
                  Utilities.SaveResources();
              }


      Et voilà !

      Maintenant tu peux ajouter toutes les variables que tu veux dans ta classe "Resource", tous ce qui est dedans sera sauvegardé et chargé !




      Exemple :

      J'ai ça dans ma classe Resource :

          public class Resource
          {
              public string test { get; set; } // "{ get; set; }" et très important !
              public List<int> test2 { get; set; } // Peut très bien être une liste d'objet de ta classe pokémon qui contient comme paramètre la vie du pokemon, son nom ... ...
          }

      Et dans ma forme/fenetre, dès que j'appuie sur un bouton ça fait ça : 

              private void Button_Click(object sender, RoutedEventArgs e)
              {
                  Utilities.resource.test = "Ceci est du texte enregisté !";
                  Utilities.resource.test2 = new List<int>() { 865496, 48978, 156, 468, 15698, 948 };
              }

      Dès que ta fenêtre sera fermé et que tu auras cliqué sur le bouton, tu peux aller dans le chemin d'accès de tes données (écrit en haut dans le string où je t'ai dit de changer des noms) et trouvé un fichier json contenant :

      {
        "test": "Ceci est du texte enregisté !",
        "test2": [
          865496,
          48978,
          156,
          468,
          15698,
          948
        ]
      }


      Voilà, et bien sure ces données seront restaurer lors du prochain lancement !

      J’espère t'avoir aidé :)

      *désolé pour les fautes ;p*




      -
      Edité par Anonyme 20 juin 2020 à 19:15:23

      • Partager sur Facebook
      • Partager sur Twitter
        21 juin 2020 à 15:54:23

        Wow, j'ai essayé, ça marche du tonnerre ! Merci beaucoup, ça résous mon premier problème. Je laisse le sujet ouvert pour une éventuelle âme charitable qui aurais une solution miracle pour le second.

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          21 juin 2020 à 16:19:53

          Tigreleonne a écrit:

          Wow, j'ai essayé, ça marche du tonnerre ! Merci beaucoup, ça résous mon premier problème. Je laisse le sujet ouvert pour une éventuelle âme charitable qui aurais une solution miracle pour le second.

          Ca peut être un peu compliquer là...

          Je fais pareille que toi, je télécharge le code source d'une page web pour en extraire les données.

          Si j'ai bien un petit conseil c'est ces deux fonctions :

                  public static string GetTextBetweenTwoWord(string txt, string begin, string end) // Avoir le texte entre deux mots
                  {
                      txt = txt.Replace("\\", string.Empty);
          
                      int Start, End;
                      if (txt.Contains(begin) && txt.Contains(end))
                      {
                          Start = txt.IndexOf(begin, 0) + begin.Length;
                          End = txt.IndexOf(end, Start);
                          return txt.Substring(Start, End - Start);
                      }
                      else
                      {
                          return null;
                      }
                  }
          
                  public static List<string> ExtractFromBody(string body, string start, string end)// Avoir tous les textes entre deux mots (dans une liste)
                  {
                      List<string> matched = new List<string>();
          
                      int indexStart = 0;
                      int indexEnd = 0;
          
                      bool exit = false;
                      while (!exit)
                      {
                          indexStart = body.IndexOf(start);
          
                          if (indexStart != -1)
                          {
                              indexEnd = indexStart + body.Substring(indexStart).IndexOf(end);
          
                              try
                              {
                                  matched.Add(body.Substring(indexStart + start.Length, indexEnd - indexStart - start.Length));
                              }
                              catch { }
          
                              body = body.Substring(indexEnd + end.Length);
                          }
                          else
                          {
                              exit = true;
                          }
                      }
          
                      return matched;
                  }
          
                  public static string RemoveDiacritics(string text) // Enlève les accents d'un mot
                  {
                      string normalizedString = text.Normalize(NormalizationForm.FormD);
                      StringBuilder stringBuilder = new StringBuilder();
          
                      foreach (char c in normalizedString)
                      {
                          UnicodeCategory unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c);
                          if (unicodeCategory != UnicodeCategory.NonSpacingMark)
                          {
                              stringBuilder.Append(c);
                          }
                      }
          
                      return stringBuilder.ToString().Normalize(NormalizationForm.FormC);
                  }





          • Partager sur Facebook
          • Partager sur Twitter

          Récupération et stockages de texte d'une page web

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown