IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Parser un fichier .csv pour récuperer des données


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 236
    Points : 61
    Points
    61
    Par défaut Parser un fichier .csv pour récuperer des données
    Bonjour,

    Je dois parser un fichier .csv qui contient un tableau de 4 colonnes à l'aide d'une commande.

    J'arrive à récupérer les différentes valeurs qui constituent mon tableau, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    <?php
     
    namespace Carvivo\CrmBundle\Command;
     
    use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
    use Symfony\Component\Console\Input\InputArgument;
    use Symfony\Component\Console\Input\InputInterface;
    use Symfony\Component\Console\Input\InputOption;
    use Symfony\Component\Console\Output\OutputInterface;
    use Symfony\Component\Finder\Finder;
     
    class  ImportAbsCommand extends ContainerAwareCommand
    {
        protected function configure()
        {
            $this
            ->setName('crm:update-abs')
            ->setDescription('Relever les absences des utilisateurs du groupe JRA');
        }
     
        private $csvParsingOptions = array(
            'finder_in' => 'web/uploads/import',
            'finder_name' => 'presence1.csv',
            'ignoreFirstLine' => true
        );
     
        protected function execute(InputInterface $input, OutputInterface $output)
        {
            $csv = $this->parseCSV();
        }
     
        /**
         * Parse du fichier CSV
         * 
         * @return array
         */
        private function parseCSV()
        {
            $em = $this->getContainer()->get('doctrine')->getManager();
            $users = $em->getRepository('Carvivo\CrmBundle\Entity\User\User');
     
            $finder = new Finder();
            $finder->files()
                ->in($this->csvParsingOptions['finder_in'])
                ->name($this->csvParsingOptions['finder_name'])
            ;
            foreach ($finder as $file) { $csv = $file; }
     
            $rows = array();
            if (($handle = fopen($csv->getRealPath(), "r")) !== FALSE)
            {
                $i = 0;
                while (($data = fgetcsv($handle, null, ";")) !== FALSE)
                {
                    $i++;
                    $rows[] = $data;
                }
                fclose($handle);
            }
            dump($rows);
        }
    }
    Avec un dump de row, j'arrive à voir le parse dans ma console :

    https://www.noelshack.com/2017-06-14...35-capture.png

    Dans ma table user, j'ai un champ absent.

    Cette commande doit se lancer 2 fois par jour (une fois le matin et l'autre l'après-midi) :

    Si un utilisateur inscris dans le tableau à une heure comprise entre 08:00 et 12:00 et qu'on est le matin (entre 8h et 12h donc), le champ absent se met à 1 ; pareil pour l'après midi.

    Si un utilisateur inscris dans le tableau à une heure comprise entre 12:00 et plus et qu'on est le matin, le champ absent se met cette fois-ci à 0 ; pareil pour l'après midi.

    Merci pour votre aide.

    EDIT : J'essaye de récupérer un mail avec la fonction in_array() pour tester mais je n'y arrive pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
        private function parseCSV()
        {
            $em = $this->getContainer()->get('doctrine')->getManager();
            $users = $em->getRepository('Carvivo\CrmBundle\Entity\User\User');
     
            $finder = new Finder();
            $finder->files()
                ->in($this->csvParsingOptions['finder_in'])
                ->name($this->csvParsingOptions['finder_name'])
            ;
            foreach ($finder as $file) { $csv = $file; }
     
            $rows = array();
     
            if (($handle = fopen($csv->getRealPath(), "r")) !== FALSE)
            {
                $i = 0;
                while (($data = fgetcsv($handle, null, ";")) !== FALSE)
                {
                    $i++;
                    $rows[] = $data;
                }
                fclose($handle);
            }
     
            if (in_array("08:00", $rows)){
                dump($rows);
            }
     
        }
    Je n'affiche pas mon dump.

  2. #2
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 236
    Points : 61
    Points
    61
    Par défaut
    J'ai réussi à parser les mails en faisant ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
        private function parseCSV()
        {
            $em = $this->getContainer()->get('doctrine')->getManager();
            $users = $em->getRepository('Carvivo\CrmBundle\Entity\User\User');
     
            $finder = new Finder();
            $finder->files()
                ->in($this->csvParsingOptions['finder_in'])
                ->name($this->csvParsingOptions['finder_name']);
     
            foreach ($finder as $file) { $csv = $file; }
     
            $rows = array();
     
            if (($handle = fopen($csv->getRealPath(), "r")) !== FALSE)
            {
                $i = 0;
                while (($data = fgetcsv($handle, null, ";")) !== FALSE)
                {
                    $i++;
                    $rows[] = $data;
                }
                fclose($handle);
            }
     
            foreach ($rows as $line)
            {
                if (in_array('bruno.bettan@lemail.com',$line, true))
                {
                    dump($line);
                }
            }
        }
    Maintenant, à la place d'écrire l'adresse mail en dure j'aimerai récupérer les adresses mails dans ma table user et les comparer avec le fichier csv.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 236
    Points : 61
    Points
    61
    Par défaut
    Bon j'ai réussi à avancé, j'arrive à ressortir deux tableaux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
        /**
         * Parse du fichier CSV
         * 
         * @return array
         */
        private function parseCSV()
        {
            $em = $this->getContainer()->get('doctrine')->getManager();
     
            $qb = $em->getRepository('Carvivo\CrmBundle\Entity\User\User')
                    ->createQueryBuilder('u')
                    ->select('u.username')
                    ->where('u.organization = 505');
     
            $users = $qb->getQuery()->execute();
     
            $finder = new Finder();
            $finder->files()
                ->in($this->csvParsingOptions['finder_in'])
                ->name($this->csvParsingOptions['finder_name']);
     
            foreach ($finder as $file) { $csv = $file; }
     
            $rows = array();
     
            if (($handle = fopen($csv->getRealPath(), "r")) !== FALSE)
            {
                $i = 0;
                while (($data = fgetcsv($handle, null, ";")) !== FALSE)
                {
                    $i++;
                    $rows[] = $data;
                }
                fclose($handle);
            }
     
            dump($users);
            dump($rows);
        }
    Je récupère mes utilisateurs en base, je récupère mon fichier csv et je le parse, j'obtiens alors en tout deux tableaux :

    https://image.noelshack.com/fichiers...12-capture.png

    J'aimerai récupérer les occurences, j'ai essayé avec un in_array, faire un foreach d'un tableau pour ensuite le comparer à l'autre mais je n'y arrive toujours pas.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Il faut que tu aplatisses les deux tableaux, de manière à avoir un tableau à une seule dimension: les emails.

    Par exemple, en supposant que $list1 est ton premier tableau et $list2 ton 2e tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $list1_flat = array_map(function($list) {
     
        foreach($list as $value) {
            return $value;
        }
     
    }, $list1);
     
     
    $list2_flat = array_map(function($list) {
        return $list[0];    
    }, $list2);
     
    var_dump($list1_flat);
    var_dump($list2_flat);
    Tu peux ensuite comparer les deux tableaux avec array_intersect() ou tout autre fonction/technique de comparaison de ton choix.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 236
    Points : 61
    Points
    61
    Par défaut
    J'ai enfin réussi à faire ce que je voulais, j'ai utiliser une autre méthode que de parser mon fichier excel, une méthode avec le findOneBy que je ne connaissais pas très bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    <?php
     
    namespace Carvivo\CrmBundle\Command;
     
    use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
    use Symfony\Component\Console\Input\InputArgument;
    use Symfony\Component\Console\Input\InputInterface;
    use Symfony\Component\Console\Input\InputOption;
    use Symfony\Component\Console\Output\OutputInterface;
    use Symfony\Component\Finder\Finder;
    use Carvivo\CrmBundle\Entity\User\User;
    use Carvivo\CrmBundle\Entity\User\Leave;
    use Symfony\Component\Validator\Constraints\DateTime;
     
    class  ImportAbsCommand extends ContainerAwareCommand
    {
        protected function configure()
        {
            $this
            ->setName('crm:update-abs')
            ->setDescription('Relever les absences des utilisateurs du groupe JRA');
        }
     
        private $csvParsingOptions = array(
            'finder_in' => 'web/uploads/absencesjra/',
            'finder_name' => 'presence1.csv',
            'ignoreFirstLine' => true
        );
     
        protected function execute(InputInterface $input, OutputInterface $output)
        {
            $csv = $this->parseCSV();
        }
     
        /**
         * Parse du fichier CSV
         * 
         * @return array
         */
        private function parseCSV()
        {
            $em = $this->getContainer()->get('doctrine')->getManager();
     
            $rows = array();
     
            $path = $this->csvParsingOptions['finder_in'].$this->csvParsingOptions['finder_name'];
     
            if (($handle = fopen($path, "r")) !== FALSE)
            {
                $i = 0;
                while (($data = fgetcsv($handle, null, ";")) !== FALSE)
                {
                    $i++;
                    $user = $em->getRepository('Carvivo\CrmBundle\Entity\User\User')->findOneByUsername($data[0]);
     
                    if(!is_null($user))
                    {   
                        $userabs = new \Carvivo\CrmBundle\Entity\User\Leave();
     
                        $date = \DateTime::createFromFormat('d/m/Y', $data[1]);
                        $newDate = $date->format('Y-m-d');
                        $dateNow = date("Y-m-d");
     
                        if($newDate == $dateNow && $data[2] == "M" && $data[3] == "A")
                        {
                            $startDateM =  new \DateTime(date("Y-m-d 08:00:00"));
                            $endDateM =  new \DateTime(date("Y-m-d 20:00:00"));
     
                            $userabs->setStartTime($startDateM);
                            $userabs->setEndTime($endDateM);
                        }
     
                        if($newDate == $dateNow && $data[2] == "M" && $data[3] == "M")
                        {
                            $startDateM =  new \DateTime(date("Y-m-d 08:00:00"));
                            $endDateM =  new \DateTime(date("Y-m-d 12:00:00"));
     
                            $userabs->setStartTime($startDateM);
                            $userabs->setEndTime($endDateM);
                        }
     
                        if($newDate == $dateNow && $data[2] == "A" && $data[3] == "A")
                        {
                            $startDateM =  new \DateTime(date("Y-m-d 12:00:00"));
                            $endDateM =  new \DateTime(date("Y-m-d 20:00:00"));
     
                            $userabs->setStartTime($startDateM);
                            $userabs->setEndTime($endDateM);
                        }
     
                        $userabs->setSeller($user);
                        $em->persist($userabs);
                    }
     
                    $rows[] = $data;
                }
     
                $em->flush();
                fclose($handle);
            }
        }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#] Problème pour récuperer des données dans une datatgridview
    Par Faible37 dans le forum Débuter
    Réponses: 2
    Dernier message: 22/03/2012, 10h26
  2. logiciel pour récuperer des données perdues
    Par hmidi dans le forum Windows
    Réponses: 5
    Dernier message: 20/05/2009, 10h49
  3. pour récuperer des données
    Par clio671 dans le forum Flex
    Réponses: 1
    Dernier message: 10/12/2008, 09h48
  4. [MySQL] utilisé un fichier XML pour stocker des données ?
    Par italiasky dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 05/05/2007, 11h04
  5. [VB6]Comment faire pour récuperer des donnée sur un mp3 ou wav ?
    Par MegaBigBoss dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 13/06/2006, 16h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo