[RESOLU] Insertion csv en bdd avec inversion colonne et ligne

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Insertion csv en bdd avec inversion colonne et ligne

Re: Insertion csv en bdd avec inversion colonne et ligne

par biddal » 19 déc. 2017, 09:36

Salut. Oui "Gestantes est bien la colonne type. Dans mon fichier y en a d'autres après mais ils ont la même structure. En tout cas merci c'est exactement ce que je voulais faire mais pas moyen de trouver comment.
Je vais maintenant juste enlever la gestion du clic car le but est que cela se fasse automatiquement car il y aura qu'un seul fichier à chaque fois dans ce dossier. Et je vais faire l'insertion en BDD.
En tout cas merci beaucoup tu m'as enlevé une sacrée épine du pied.

Re: Insertion csv en bdd avec inversion colonne et ligne

par tesmet » 18 déc. 2017, 18:33

Hello, la colonne type est "Gestantes" dans l'exemple ? À tester pour voir si le requête voulue s'affiche pour le CSV cliqué.

Code : Tout sélectionner

<?php $dossier = glob('csv/*'); // ou bien 'csv/*.[cC][sS][vV]' pour aussi limiter à l'extension csv if(!$nb_fichier = count($dossier)) echo "Il n'y a aucun fichier dans le dossier"; else echo "Il y a <strong>&nbsp;$nb_fichier&nbsp;</strong> fichier(s) dans le dossier"; echo '<ul>'; foreach($dossier as $fichier) { printf('<li><a href="?fichier=%s">%s</a></li>', urlencode($fichier), pathinfo($fichier, PATHINFO_FILENAME)); } echo '</ul>'; // traiter le fichier cliqué de la liste ci-haut ??? Pourrait aussi faire tous les CSV avec un foreach($dossier as $fichier) if(!empty($_GET['fichier']) && in_array($fichier=$_GET['fichier'], $dossier)) { $tableau = array(); printf('<pre>réel <a href="%s" target="_blank">%s</a><br>', $fichier, pathinfo($fichier, PATHINFO_FILENAME)); $lignes = file($fichier); $dates = array_filter(str_getcsv(implode(array_slice($lignes, 3, 1)), ';')); // les dates sont à la ligne 4 donc indice 3 $type = array_shift($dates); // enlever la colonne type des dates ??? $heures = array_slice($lignes, 4, 24); // les 24 heures à partir de la ligne 5 (indice 4) et suivantes $prototype = array_combine(array_merge(['id', 'type', 'date'], range(23, 0)), array_fill(0, 27, 0)); // id à NULL pour AUTOINCREMENT via le 0 du array_fill devrait-être suffisant // sinon ce sera: $prototype['id'] = 'NULL'; // même avec une source fiable, est-ce qu'une apostrophe dans le texte de la colonne type est possible ??? // sauf que je sais pas si PDO est utilisé ou non $prototype['type'] = "'$type'"; // avec PDO ce sera: $prototype['type'] = $pdo->quote($type); foreach($dates as $i => $date) { $tableau[$i] = $prototype; $date = implode('-', array_reverse(explode('/', $date))); // pour changer jj/mm/aaaa en aaaa-mm-jj pour MySQL // si la source est fiable alors la date ne posera pas problème pour la requête // mais un $tableau[$i]['date'] = $pdo->quote($date); n'endommagerait pas la date non plus $tableau[$i]['date'] = "'$date'"; } foreach($heures as $ligne) { $data = str_getcsv($ligne, ';'); $heure = intval(array_shift($data)); // suffisant pour conserver le premier nombre comme indice d'heure ??? foreach($data as $i => $nb_procs) { if(!trim($nb_procs)) continue; // au cas où // intval() fait déjà un filtre protecteur pour la requête, pas besoin de plus $tableau[$i][$heure] = intval($nb_procs); // affecter les données INT dans le tableau transposé } } // construire un INSERT VALUES pour insérer toutes les dates de ce CSV en une seule requête MySQL ??? foreach($tableau as $ligne) { $sql[] = "\n(" . implode(', ', $ligne) . ')'; } $sql = 'INSERT INTO releve VALUES ' . implode(',', $sql); echo $sql; // pour insérer avec PDO ce devrait-être: $pdo->query($sql); echo '</pre>'; }

Insertion csv en bdd avec inversion colonne et ligne

par biddal » 18 déc. 2017, 10:32

Bonjour,
Voilà je viens auprès de vous afin d'avoir de l'aide.
En effet je dois insérer un fichier csv en base de données mais en inversant les colonnes et les lignes.
Voici mon code actuel:

Code : Tout sélectionner

<h1>Gestion des compteurs d'eau</h1> <main> <?php $nb_fichier = 0; $dossier = ""; $ok=0; echo '<ul>'; //Scan du dossier csv if($dossier = opendir('./csv')) { while(false !== ($fichier = readdir($dossier))) { // le count inclut toujours le dossier actuel et le dossier parent d'où ce test avec le . et le .. if($fichier != '.' && $fichier != '..') { $nb_fichier++; echo '<li><a href="./csv/' . $fichier . '">' . $fichier . '</a></li>'; } } echo '</ul><br />'; $ok=1; closedir($dossier); } else { echo 'Le dossier n\' a pas pu être ouvert'; } ?> </main> <?php if($ok==1) { echo "<div id=\"rslt\">"; if($nb_fichier<0) { echo 'Il n\'y a aucun fichier dans le dossier'; } else { echo 'Il y a <strong>&nbsp;' . $nb_fichier . '&nbsp;</strong> fichier(s) dans le dossier'; echo "</div>"; //Connection des fichiers en base include 'connectBDD.php'; connectBdd(); ?> <?php $row = 1; if($dossier = opendir('./csv')) { while(false !== ($fichier = readdir($dossier))) { //Récupération du fichier et classement dans un tableau ligne par ligne //Le @ sert à ne pas afficher l'erreur //Le r pour ouvrir le fichier en lecture seule if (($handle = @fopen("./csv/".$fichier, "r")) !== FALSE) { ?> <div id="tableau"> <!-- le ; étant le caractère séparant les différents champs de chaque ligne --> <?php $filename = "./csv/".$fichier; $ligne= file($filename); $nbTotalLignes=count($ligne); $tab = array(); for($i=0;$i<$nbTotalLignes;$i++){ $ligneTab = explode(";", $ligne[$i]); //$tab[$ligneTab[0]] =$ligneTab[1]; print_r ($ligneTab); echo "<br>"; } //print_r($tab); ?> </div> <?php fclose($handle); } } closedir($dossier); } } }
Ce code me permet d'afficher le fichier csv après ouverture jusqu'ici aucun soucis.
Voici un extrait du fchier csv (qui a toujorus la même structure seules les valeures changent).

Code : Tout sélectionner

Array ( [0] => D�but : 07 novembre 2017 [1] => ) Array ( [0] => Fin : 17 novembre 2017 [1] => ) Array ( [0] => ) Array ( [0] => Gestantes [1] => 16/11/2017 [2] => 15/11/2017 [3] => 14/11/2017 [4] => 13/11/2017 [5] => 12/11/2017 [6] => 11/11/2017 [7] => 10/11/2017 [8] => 09/11/2017 [9] => 08/11/2017 [10] => 07/11/2017 [11] => ) Array ( [0] => 23h � 24h [1] => 0 [2] => 6 [3] => 0 [4] => 5 [5] => 2 [6] => 5 [7] => 11 [8] => 1 [9] => 34 [10] => 1 [11] => ) Array ( [0] => 22h � 23h [1] => 1 [2] => 0 [3] => 5 [4] => 0 [5] => 17 [6] => 14 [7] => 1 [8] => 0 [9] => 57 [10] => 23 [11] => ) Array ( [0] => 21h � 22h [1] => 15 [2] => 17 [3] => 19 [4] => 24 [5] => 23 [6] => 21 [7] => 16 [8] => 15 [9] => 54 [10] => 23 [11] => ) Array ( [0] => 20h � 21h [1] => 27 [2] => 28 [3] => 39 [4] => 57 [5] => 57 [6] => 64 [7] => 46 [8] => 34 [9] => 58 [10] => 57 [11] => ) Array ( [0] => 19h � 20h [1] => 45 [2] => 67 [3] => 61 [4] => 48 [5] => 66 [6] => 82 [7] => 62 [8] => 54 [9] => 74 [10] => 61 [11] => ) Array ( [0] => 18h � 19h [1] => 74 [2] => 56 [3] => 64 [4] => 64 [5] => 54 [6] => 33 [7] => 65 [8] => 49 [9] => 63 [10] => 69 [11] => ) Array ( [0] => 17h � 18h [1] => 68 [2] => 64 [3] => 84 [4] => 70 [5] => 76 [6] => 58 [7] => 61 [8] => 77 [9] => 70 [10] => 80 [11] => ) Array ( [0] => 16h � 17h [1] => 56 [2] => 117 [3] => 54 [4] => 61 [5] => 58 [6] => 51 [7] => 68 [8] => 62 [9] => 102 [10] => 79 [11] => ) Array ( [0] => 15h � 16h [1] => 66 [2] => 73 [3] => 79 [4] => 70 [5] => 51 [6] => 49 [7] => 82 [8] => 77 [9] => 76 [10] => 82 [11] => ) Array ( [0] => 14h � 15h [1] => 86 [2] => 71 [3] => 73 [4] => 51 [5] => 58 [6] => 65 [7] => 65 [8] => 72 [9] => 69 [10] => 73 [11] => ) Array ( [0] => 13h � 14h [1] => 63 [2] => 65 [3] => 68 [4] => 52 [5] => 71 [6] => 64 [7] => 60 [8] => 80 [9] => 52 [10] => 58 [11] => ) Array ( [0] => 12h � 13h [1] => 67 [2] => 67 [3] => 52 [4] => 66 [5] => 52 [6] => 69 [7] => 76 [8] => 42 [9] => 40 [10] => 79 [11] => ) Array ( [0] => 11h � 12h [1] => 60 [2] => 60 [3] => 58 [4] => 53 [5] => 57 [6] => 54 [7] => 58 [8] => 44 [9] => 49 [10] => 96 [11] => ) Array ( [0] => 10h � 11h [1] => 59 [2] => 56 [3] => 71 [4] => 66 [5] => 53 [6] => 62 [7] => 53 [8] => 78 [9] => 48 [10] => 53 [11] => ) Array ( [0] => 9h � 10h [1] => 45 [2] => 48 [3] => 46 [4] => 64 [5] => 46 [6] => 45 [7] => 46 [8] => 71 [9] => 57 [10] => 47 [11] => ) Array ( [0] => 8h � 9h [1] => 43 [2] => 72 [3] => 42 [4] => 45 [5] => 40 [6] => 43 [7] => 41 [8] => 57 [9] => 45 [10] => 42 [11] => ) Array ( [0] => 7h � 8h [1] => 27 [2] => 17 [3] => 9 [4] => 18 [5] => 16 [6] => 30 [7] => 21 [8] => 16 [9] => 1 [10] => 10 [11] => ) Array ( [0] => 6h � 7h [1] => 3 [2] => 3 [3] => 16 [4] => 0 [5] => 0 [6] => 8 [7] => 1 [8] => 1 [9] => 14 [10] => 6 [11] => ) Array ( [0] => 5h � 6h [1] => 0 [2] => 0 [3] => 1 [4] => 0 [5] => 3 [6] => 21 [7] => 5 [8] => 8 [9] => 0 [10] => 3 [11] => ) Array ( [0] => 4h � 5h [1] => 0 [2] => 0 [3] => 0 [4] => 1 [5] => 3 [6] => 0 [7] => 6 [8] => 1 [9] => 1 [10] => 1 [11] => ) Array ( [0] => 3h � 4h [1] => 1 [2] => 0 [3] => 0 [4] => 0 [5] => 0 [6] => 2 [7] => 1 [8] => 0 [9] => 7 [10] => 0 [11] => ) Array ( [0] => 2h � 3h [1] => 0 [2] => 0 [3] => 0 [4] => 0 [5] => 0 [6] => 4 [7] => 4 [8] => 1 [9] => 7 [10] => 0 [11] => ) Array ( [0] => 1h � 2h [1] => 8 [2] => 2 [3] => 1 [4] => 2 [5] => 0 [6] => 1 [7] => 19 [8] => 1 [9] => 1 [10] => 1 [11] => ) Array ( [0] => 0h � 1h [1] => 1 [2] => 4 [3] => 0 [4] => 12 [5] => 14 [6] => 11 [7] => 16 [8] => 0 [9] => 1 [10] => 12 [11] => ) Array ( [0] => Total: [1] => 815 [2] => 893 [3] => 842 [4] => 829 [5] => 817 [6] => 856 [7] => 884 [8] => 841 [9] => 980 [10] => 956 [11] => ) Array ( [0] => Nombre porcs: [1] => 0 [2] => 0 [3] => 0 [4] => 0 [5] => 0 [6] => 0 [7] => 0 [8] => 0 [9] => 0 [10] => 0 [11] => ) Array ( [0] => Total Gestantes: [1] => 8713 [2] => ) Array ( [0] => ) Array ( [0] => )
Comme vous pouvez le voir les noms de colonnes dans ce fichier csv sont les dates or celles-ci changent à chaque fichier csv reçu donc ma base de données est faite à l'envers c'est à dire que les noms de colonnes sont:

Code : Tout sélectionner

<?xml version="1.0" encoding="UTF-8"?> <!-- - phpMyAdmin XML Dump - version 4.7.4 - https://www.phpmyadmin.net - - Hôte : 127.0.0.1:3306 - Généré le : mar. 05 déc. 2017 à 12:42 - Version du serveur : 5.7.19 - Version de PHP : 5.6.31 --> -<pma_xml_export xmlns:pma="https://www.phpmyadmin.net/some_doc_url/" version="1.0"> <!-- - Structure schemas --> -<pma:structure_schemas> -<pma:database charset="latin1" collation="latin1_swedish_ci" name="gestion_compteur_eau"> <pma:table name="releve"> CREATE TABLE `releve` ( `id` int(11) NOT NULL AUTO_INCREMENT, `type` varchar(50) DEFAULT NULL, `date` date NOT NULL, `heure_23` int(11) NOT NULL, `heure_22` int(11) NOT NULL, `heure_21` int(11) NOT NULL, `heure_20` int(11) NOT NULL, `heure_19` int(11) NOT NULL, `heure_18` int(11) NOT NULL, `heure_17` int(11) NOT NULL, `heure_16` int(11) NOT NULL, `heure_15` int(11) NOT NULL, `heure_14` int(11) NOT NULL, `heure_13` int(11) NOT NULL, `heure_12` int(11) NOT NULL, `heure_11` int(11) NOT NULL, `heure_10` int(11) NOT NULL, `heure_09` int(11) NOT NULL, `heure_08` int(11) NOT NULL, `heure_07` int(11) NOT NULL, `heure_06` int(11) NOT NULL, `heure_05` int(11) NOT NULL, `heure_04` int(11) NOT NULL, `heure_03` int(11) NOT NULL, `heure_02` int(11) NOT NULL, `heure_01` int(11) NOT NULL, `heure_00` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; </pma:table> </pma:database> </pma:structure_schemas> <!-- - Base de données : 'gestion_compteur_eau' --> -<database name="gestion_compteur_eau"> <!-- Table releve --> </database> </pma_xml_export>
J'ai mis les heures en noms de colonnes car celles-ci sont fixes. Mais je n'arrive pas à trovuer mes boucles de telle sorte que pour l'enregistrement en BDD cela me prenne la première date à la ligne 4 en ensuite prendre tous les éléments des lignes (5 à 28) et me les enregistrent sur une ligne en BDD! Et ensuite passer à la colonne 2 etc.
Quelqu'un pourrai m'aider?
JE ne sais pas sij'ai bien expliquer mon problème.
Je vous remercie par avance.