Bonjour à tous,

Mon équipe part sur le terrain pour mesurer des données prises dans une rivière. Tous les 10mn, les capteurs génèrent des fichiers, ou alimente un fichier CSV.

Quad ils reviennent au bureau, il faut importer ceci dans la base de donnée CakePHP. S'ils ont une connection internet, ils devraient pouvoir le faire depuis l'hotel...

Comment puis-je alimenter ma base de donnée avec des fichier SVC?

Es-ce que CakePHP 3 à une fonction qui permet de lire le fichier CSV et importer ces dans la table 'measures'? J'ai aussi vu qu'en revenche, il y aurait une solution avec XML []http://book.cakephp.org/1.3/en/The-Manual/Core-Utility-Libraries/Xml.html(http://book.cakephp.org/1.3/en/The-Manual/Core-Utility-Libraries/Xml.html). Avez-vous une expérience avec ceci et me trabsmettre une marche à suivre?

Milles mercis pour vos lumières!!

6 réponses


Je ne crois pas que de base Cake embarque une librairie ou une class pour gérer le CSV mais tu peux regarder du côté des librairies externes comme celle de phpleague : http://csv.thephpleague.com/

Comme tu utilise la version 3 de Cake, l'installation est relativement facile via Composer et les exemples fournis dans la doc de la librairie devrait t'aider à faire ce que tu souhaites.

essaie ce plugin
il est facile d'utilisation.

Bonsoir.

essaie ce plugin
il est facile d'utilisation.

Tu te trompe quelque peu à mon avis, le plugin que tu proposes concerne l'affichage de données depuis un format CSV et l'export de données sous format CSV, mais ne dispose pas d'une classe permettant de transférer des données d'un format CSV vers une BDD.

Oui, dsl Lartak, j'ai répondu un peu vite

voici ce que j'utilise pour mes imports en CSV :
j'utilise un formaulaire de type file.
si t'as des questions n'hésite pas.

pour l'exemple, mon fichier CSV fait 20 lignes, et il a 4 colonnes


$extension = strtolower(pathinfo($this->request->data['name']['name'] , PATHINFO_EXTENSION));
$filename = strtolower($this->request->data['name']['name']);
$tmpname = WWW_ROOT . "/files/" . $filename . "";

if (
                !empty($this->request->data['name']['tmp_name']) &&
                in_array($extension, array('csv')) // je verifie s'il y a bien un fichier, et que l'extension est bien un csv
            ) {
                move_uploaded_file($this->request->data['name']['tmp_name'], $tmpname); // je bouge le fichier dans le dossier temporaire

                $csvfile = fopen($tmpname, 'r'); // j'ouvre le fichier

                $fichier = file($tmpname);

                $lines = intval(count(file($tmpname))); // je compte le nbre de ligne (20 lignes dans mon exemple)
                $debut = 1; // je commence à partir de la ligne 1 (au lieu de 0, car c'est le header du tableau)

                for ($i=$debut; $i<$lines; $i++) {
                    $csv_array = explode(";", $fichier[$i]); // je crée un tableau avec chaque case de la ligne
                    if (!empty($csv_array) && !empty($csv_array[1])) { // je verifie si les 2 premieres cases ne sont pas vides

                        $data = [

                            'champ1'       =>$csv_array[0],// colonne 1
                            'champ2'       =>$csv_array[1],// colonne 2
                            'champ3'          =>$csv_array[2],// colonne 3
                            'champ4'          =>$csv_array[3],// colonne 4

                        ];
                        $sauvegarde = $matable->newEntity($data);
                        $matable->save($sauvegarde);
                    }

                }

                fclose($csvfile);
                unlink($tmpname); // je supprime le fichier temporaire
                $this->Flash->success('Données rentrées avec succès');
                $this->redirect($this->referer());

            }

Merci pour vos messages
@GyZmO
Je suis très intéressé par ta proposition. Pourrais-tu me donner plus d'info?
Es-ce que je peux l'installer sur CakePHP3? Si oui comment?

Je maitrise pas trop composeur.
J'ai lu ici [http://csv.thephpleague.com/installation/]() qu'il fallait lancer cette commande,

$ composer require league/csv:^8.0

mais dans quel dossier, je dois me trouver avant de lancer cette commande

Je suis un peu perdu en pensant comment intégré ceci dans CakePHP
[http://csv.thephpleague.com/instantiation/]()

[http://csv.thephpleague.com/basic-usage/]()

Sur le coup, je pense que je peux très bien faire une application indépendante à CakePHP, soit full PHP

Dans ce cas, je pourrais mettre un fichier import.php à la racine de mon application avec ce code?

<?php

use League\Csv\Reader;

$csv = Reader::createFromPath('/path/to/your/csv/file.csv');

//get the first row, usually the CSV header
$headers = $csv->fetchOne();

//get 25 rows starting from the 11th row
$res = $csv->setOffset(10)->setLimit(25)->fetchAll();

Mais dans ce cas, comment être sûre que

use League\Csv\Reader;

fonctionne correctement.

Je suis sur un serveur Ubuntu 16, que je gère à 100% et qui se trouve dans ma salle de serveur. Il y a Apache2, MySQL
ou j'ai encore installé:
php-mcrypt, php-mbstring, php-gettext, php-intl

Attention, mes fichiers ont énormlment de lignes. Toutes les 10mn, mes loggers enregistrent des données.

@alexyon
Merci, je vais aussi regarder ta proposition

Merci pour tes lumières, je suis impatient d'essayé ceci.

Bonjour.

mais dans quel dossier, je dois me trouver avant de lancer cette commande

Tout simplement à la racine de ton application CakePHP, soit au même niveau que se trouve le fichier composer.json.
Ensuite, une fois que la librairie sera installée, il te suffira d'ajouter dans le controller dans lequel tu veux faire tes manipulations pour le CSV : use League\Csv\Reader; après la déclaration du namespace du controller.
Pour la suite, tu fais comme il doit être indiqué dans la documentation de la librairie.
Pour t'expliquer rapidement, lorsque tu lances l'installation d'une librairie tierce avec Composer au niveau de la racine de ton application CakePHP, Composer va l'installer dans le dossier vendor qui se situe à la racine de ton application, ce qui est en général le cas pour tous les framework par exemple.
Ensuite il te suffit de déclarer les use ...\...\...; en suivant les indications sur les documentations des librairies.

Sur le coup, je pense que je peux très bien faire une application indépendante à CakePHP, soit full PHP

Non, c'est totalement inutile, il n'y a pas de manipulation supplémentaire à faire pour dire à CakePHP que tu veux utiliser telle ou telle librairie.