Partage
  • Partager sur Facebook
  • Partager sur Twitter

symfony parc informatique,fichier txt

    20 septembre 2017 à 11:24:17

    bonjour,
    je suis débutante en symfony et je dois faire un projet symfony qui permet de récupérer l'inventaire  d'un parc informatique (nom ordinateur,ip,numéro de série, nom utilisateur) dans des différents fichier txt  (chaque fichier texte correspond au données d'un ordinateur) et de 
    l'enregistrer dans ma base Mysql Auriez vous une idée de comment procéder?
    je travaille en local actuellement et je dois basculer mon projet sur un server windows 2012.
    Merci d'avance,
    • Partager sur Facebook
    • Partager sur Twitter
      20 septembre 2017 à 11:26:32

      Peut-être aurais-tu une piste de réflexion voire une ébauche de code à nous donner ?
      Là tel quel, j'ai l'impression de faire ton travail et vais te renvoyer vers le tuto Symfony de ce site.
      • Partager sur Facebook
      • Partager sur Twitter
        20 septembre 2017 à 11:40:08

        Bonjour,

        Le travail consiste à mapper les données de chaque fichier texte dans les propriétés des entités de Symfony.

        Une commande console de Symfony peut faire le boulot ... elle reste à développer selon le principe que j'ai indiqué ci-dessus.

        C'est assez simple à faire me semble t-il si la structure des fichiers texte est normalisée et si les entités définies dans Symfony sont assez proches du modèle texte.

        A+

        • Partager sur Facebook
        • Partager sur Twitter
          20 septembre 2017 à 12:27:09

          faisons simple j'ai des plusieurs fichiers texte qui contient des information concernant chaque poste.j'ai déjà créer une entité poste (ordinateur) et une entité user,ma question est de savoir comment insérer ces données dans ma base mysql de manière automatique.

          Voici comment mes données sont insérées dans chaque fichier txt:

          PF09;Windows 7 Professional (6.1) x86 FRA;Service Pack 1;101;xx;yy;xx;xx;xF;Kg;2y;Intel(R) Core(TM) i3-2120 CPU @ 3.30GHz;3300;4;4096;20;20276;;;;;u;;PC;Intel(R) HD Graphics

          chaque information correspondent à des variables séparées par des points virgules:
          $netbios_name;$os_&_langue;$service_pack;$mac_address;$ip_address;$logon_domain;$user_id;$user_fullname;$manufacturer;$model;$serial_number;$version_bios;$release_date_bios;$processor_name;$current_clock_speed;$nb_proc;$total_memory;$size_c;$free_space_c;$size_d;$freespace_d;$size_e;$free_space_e;$site;$description;$chassis_type;$video_caption
          • Partager sur Facebook
          • Partager sur Twitter
            20 septembre 2017 à 20:32:54

            Si tu connais Symfony il suffit donc de mapper chaque donnée dans les propriétés des entités.

            Donc tu lis chaque fichier et compte-tenu que les variables sont séparés par un séparateur, c'est facile de les mettre en variable pour insérer dans une entité. Par exemple avec un explode puis

            $entite->setProperty($variable); 

            dans une commande console.

            C'est quoi le problème avec ces informations ?

            A+

            • Partager sur Facebook
            • Partager sur Twitter
              20 septembre 2017 à 21:28:00

              Symfony, c'est pas un peu lourd pour faire juste ce que tu veux faire ? Je veux dire que ça, c'est à la louche une vingtaine de ligne de code et là, t'aurais quelque-chose d'hyper lourd avec tout le code de symfony...

              • Partager sur Facebook
              • Partager sur Twitter
              Si vous voulez de l'aide, postez votre code.
                21 septembre 2017 à 6:45:07

                @Basmo : c'est vrai que l'on peut faire plus simple (?) en faisant sans Symfony et en insérant directement les données dans les tables sans passer par les entités. Mais je trouve qu'en faisant une commande console c'est plus homogène pour travailler au niveau entité qu'au niveau table. En terme de code à développer cela me semble équivalent pour cette partie d'insertion .

                Le plus difficile dans ce sujet - qui n'a rien de complexe - est de bien parser les données des fichiers texte et là ce n'est pas du Symfony mais du php classique..

                A+

                -
                Edité par monkey3d 21 septembre 2017 à 6:45:51

                • Partager sur Facebook
                • Partager sur Twitter
                  22 septembre 2017 à 17:11:46

                  ccu désolé du retard,j'ai éssayé de faire comme tu l'as dis @monkey3d, mais je ne sais pas comment les insérer automatiquement dans la base.j'arrive à lire tous les fichiers et à afficher les contenus, mais le problème est au niveau de l’insertion des données.

                  Pour répondre à @basmo il est vrai que symfony est lourd sauf que je voudrai apprendre à l'utiliser.

                     $dir = "C:\wamp\www\inventaire\inventa";
                                  // Ouvre un dossier bien connu, et liste tous les fichiers
                                  if (is_dir($dir)) {
                                      if ($dh = opendir($dir)) {
                                          while (($file = readdir($dh)) !== false) {
                                              if($file != '.' && $file != '..'){
                                                  $car="\\";
                                                  $file= $dir.$car.$file;
                                                  echo 'fichier : ' .$file ."<br/>";
                                                  $ouvrir = fopen($file, "r");  // ouverture du fichier
                                                      while (!feof ($ouvre))          // tant que pas en fin de fichier
                                                      { $lire = fgets($ouvrir, 4096); 
                                                          $donnee=explode(";",$lire);  
                                                          
                                                                  }
                                                              if(isset($donnee[17])){   
                                                                  
                                                                  $netbios_name = $donnee[0];
                                                                  $os = $donnee[1];
                                                                  $mac_address  = $donnee[3];      
                                                                  $ip_address = $donnee[4];      
                                                                  $manufacturer   = $donnee[8];     
                                                                   $model = $donnee[9];
                                                                   $serial_number   = $donnee[10];      
                                                                   $processor_name   = $donnee[13];    
                                                                   $total_memory     = $donnee[16];   
                                                                   $site      = $donnee[23];
                                                                
                                                                $em=$this->getDoctrine()->getEntityManager();
                                                                $poste=$em->getRepository('AppBundle:Poste');
                                                                $poste->setNomPoste($netbios_name);
                                                                $poste->setOs($os);
                                                                $poste->setMac($mac_address);      
                                                                $poste->setDerniereIp($ip_address);     
                                                                $poste->setConstructeur($manufacturer);     
                                                                $poste->setModel($model);
                                                                $poste->setSeriePoste($serial_number); 
                                                                $poste->setProcesseur($processor_name);  
                                                                $poste->setRam($total_memory);            
                                                                $poste_>setSitePoste($site);
                                                                $em->persist($poste);
                                                                $em->flush();
                                                                $request->getSession()->getFlashBag()->add();
                                                                   
                                                              }
                                                      }
                                              }
                                          }
                                      }closedir($dh);



                  -
                  Edité par Olywin 22 septembre 2017 à 17:14:00

                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 septembre 2017 à 5:27:53

                    Qu'est ce qui ne fonctionne pas ?

                    Il ne sert à rien de récupérer à chaque fois dans ta boucle l'entity manager. Tu récupères avant et tu fais à chaque boucle un new pour créer l'entité que tu peuples alors avec les set.

                    Peut-être qu'on ne voir pas le début de ton code ? ... en tout cas il te manque des choses ... fais une commande console comme je t'ai indiqué.

                    https://symfony.com/doc/current/console.html

                    Le code que tu as développé tu le mets dans la fonction execute.

                    A+

                    • Partager sur Facebook
                    • Partager sur Twitter
                      26 septembre 2017 à 11:52:38

                      merci monkey3d

                      j'ai pu les insérer dans la base juste en persistant les données récupérées dans les fichiers texte. que pensez vous de ma fonction crée au niveau du controller? es une bonne méthode

                       public function testAction(){
                              $dir = "C:\wamp\www\inventaire\inventa";
                                      // Ouvre un dossier bien connu, et liste tous les fichiers
                                      if (is_dir($dir)) {
                                          if ($dh = opendir($dir)) {
                                              while (($file = readdir($dh)) !== false) {
                                                  if($file != '.' && $file != '..'){
                                                      $car="\\";
                                                      $file= $dir.$car.$file;
                                                    //  echo 'fichier : ' .$file ."<br/>";
                                                      $ouvre = fopen($file, "r");  // ouverture du fichier
                                                          while (!feof ($ouvre))          // tant que pas en fin de fichier
                                                          { $lecture = fgets($ouvre, 4096); // stockage dans $lecture
                                                              $donnee=explode(";",$lecture);  // parsing des données basé sur ";")
                                                              $combien=count($donnee)-1; // nbre d'éléments séparés par ";"
                                                              for ($i=0;$i<=$combien;$i++)
                                                                      {
                                                                  if(isset($donnee[3])){
                                                                     
                                                                  }
                                                                      }
                                                                  if(isset($donnee[17])){   
                                                                      
                                                                      $netbios_name = $donnee[0];
                                                                      $os = $donnee[1];
                                                                      $service_pack= $donnee[2];
                                                                      $mac_address  = $donnee[3];      
                                                                      $ip_address = $donnee[4];      
                                                                      $logon_domain = $donnee[5];
                                                                      $user_id = $donnee[6];
                                                                      $user_fullname  = $donnee[7];     
                                                                      $manufacturer   = $donnee[8];     
                                                                       $model = $donnee[9];
                                                                       $serial_number   = $donnee[10];    
                                                                       $version_bios = $donnee[11];
                                                                       $release_date_bios  = $donnee[12];     
                                                                       $processor_name   = $donnee[13];    
                                                                       $current_clock_speed   = $donnee[14];    
                                                                       $nb_proc       = $donnee[15];
                                                                       $total_memory     = $donnee[16];
                                                                       $size_c       = $donnee[17];
                                                                       $free_space_c    = $donnee[18];  
                                                                       $size_d      = $donnee[19];
                                                                       $freespace_d     = $donnee[20];  
                                                                       $size_e = $donnee[21];
                                                                       $free_space_e   = $donnee[22];    
                                                                       $site      = $donnee[23];
                                                                       $description = $donnee[24];
                                                                       $chassis_type    = $donnee[25];  
                                                                       $video_caption = $donnee[26];
                                                                       
                              $em=$this->getDoctrine()->getEntityManager();
                              $poste= new Poste;
                                      //$em->getRepository('AppBundle:Poste');
                              $poste->setNomPoste($netbios_name);
                              $poste->setOs($os);
                              $poste->setMac($mac_address);      
                              $poste->setDerniereIp($ip_address);     
                              $poste->setConstructeur($manufacturer);     
                              $poste->setModel($model);
                              $poste->setSeriePoste($serial_number); 
                              $poste->setProcesseur($total_memory);  
                              $poste->setRam($total_memory); 
                              
                                $siteE=$em->getRepository('AppBundle:Site');
                              //vérification existence site
                                if($site===$siteE){
                                  $poste_>setSitePoste($site);
                              }
                              
                                   $em->flush();
                                  $em->persist($poste);
                                  
                                            }
                                                          }
                                                  }
                                              }
                                          }closedir($dh);
                                      }
                          }


                      ?

                      • Partager sur Facebook
                      • Partager sur Twitter
                        26 septembre 2017 à 13:36:23

                        Puisque tu demandes plusieurs choses :

                        - pourquoi absolument dans un contrôleur ? versus Commande console car en fait tu n'as rien de particulièrement web dans cette action. C'est aussi une manière de progresser sur Symfony.

                        - pas bon de mettre un chemin absolu dans ton code ligne 2 car évidemment si tu changes le chemin tu dois refaire le code. Passe le en paramètre. Et pour insister avec une commande Console comme c'est facile de passer des paramètres. ;)

                        - tu testes des conditions mais si la condition est ko tu ne fais rien : tu pourrais au moins émettre un message d'erreur et sortir proprement.

                        - je ne vois pas pourquoi tu peuples plein de variables de la ligne 24 à 50 pour finalement t'en servir de quelques unes ligne 55 à 63. De plus pourquoi ne pas mettre directement la variable trouvée après le tableau explode : question de lisibilité ? bof ... Exemple ligne 55 :

                        $poste->setNomPoste($donnee[0])

                        Indentation bizarre à la fin

                        A+

                        -
                        Edité par monkey3d 26 septembre 2017 à 13:37:19

                        • Partager sur Facebook
                        • Partager sur Twitter
                          27 septembre 2017 à 17:04:10

                          ok dac, merci beaucoup monkey3d  tu as raison

                          • j'ai créer la class et insérer  les données comme tu l'as indiqué, cependant je suis confronté à un problème : il ne reconnais pas les indices
                           
                          $poste->setOs($donnee[1]);                                        
                          $poste->setMac($donnee[3]);
                          Notice: Undefined offset: 1 
                          • connaissez vous une commande console d'import de fichier txt  que je pourrai exécuter dans un fichier batch? peut être que c'est une question bête mais franchement j'ai fait des recherches et je ne trouve rien concernant l'import de fichier txt.
                          Au secouuuuurs!!!!
                          • Partager sur Facebook
                          • Partager sur Twitter
                            27 septembre 2017 à 17:13:40

                            Cela me semble bizarre ton histoire d'indice undefined. As tu vérifié avant de faire le set que tes variables étaient correctement valorisées ?

                            Mais pourquoi as tu besoin d'importer ton ficher txt par une commande console Symfony dans un fichier batch ????

                            Dans ta commande console Symfony tu fais ce que tu montrais dans ton code testAction : c'est à dire que tu ouvres ton fichier et tu le traites.

                            C'est peut-être pour cela que ton indice est undefined. 

                            Tu peux montrer le code de ta commande console ?

                            A+

                            • Partager sur Facebook
                            • Partager sur Twitter
                              9 novembre 2017 à 18:30:07

                              Pourquoi ne pas utiliser Load Data Infile (si c'est pas trop tard)

                              $db = $this->em->getConnection();
                              
                              $sql = "LOAD DATA INFILE 'my_file.txt' INTO TABLE my_table CHARACTER SET 'latin1' FIELDS TERMINATED BY ';' ENCLOSED BY '\"' LINES TERMINATED BY '\n' IGNORE 1 LINES";
                              
                              $sql .= " (@champ1, @champ2, @champ3)";
                              
                              $sql .= " set champ1 = @champ1 ,champ2 = @champ2 ,champ3 = @champ3";
                              
                              $stmt = $db->prepare($sql);
                              
                              $stmt->execute();



                              • Partager sur Facebook
                              • Partager sur Twitter

                              symfony parc informatique,fichier txt

                              × 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