[RESOLU] Crée csv depuis php

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] Crée csv depuis php

Re: Crée csv depuis php

par xstevenetx » 02 avr. 2021, 21:29

Merci infiniment tu est le meilleur.

Re: Crée csv depuis php

par Ryle » 02 avr. 2021, 18:02

La version illustrée ;)
$lis = array();
$lieuEnCours = ''; // déclaration de la variable temporaire
...
// on compare les variables lieu et lieu temporaire
if ($lieuEnCours != $liste) { // si les valeurs sont différentes
   $lis[] = array($liste, $ip); // tu renseignes ton lieu pour qu'il apparaisse dans le fichier csv
   $lieuEnCours = $liste; //  tu mets à jour ta variable temporaire
}
else { // si les valeurs sont identiques 
   $lis[] = array('', $ip); // tu mets une valeur vide à la place du lieu dans ton fichier csv
}

Re: Crée csv depuis php

par xstevenetx » 02 avr. 2021, 15:04

Merci pour ta réponse mais la je crois que c'est hors de mes petites compétences.
Un exemple serait le bienvenue.

Merci beaucoup

Re: Crée csv depuis php

par Ryle » 02 avr. 2021, 09:52

Oui, c'est possible, il suffit de passer une valeur vide à la place de $liste quand celle-ci est identique à celle de la précédente itération du foreach :)

Pour cela il te faut une variable temporaire que tu déclares avant ton foreach, puis dans ta boucle tu compares la valeur de $liste de l'itération en cours, à la valeur contenue dans cette variable temporaire :
- si les valeurs sont différentes (ça sera le cas dès la première ligne :)), alors tu renseignes ton lieu pour qu'il apparaisse dans le fichier csv et tu mets à jour ta variable temporaire avec celui-ci (elle aura donc pour valeur Lieu1 tant que tu ne sera pas arrivé au Lieu2)
- si les valeurs sont identiques (ça sera le cas sur la seconde ligne de ton exemple), alors tu mets une valeur vide à la place du lieu dans ton fichier csv

Tu verras alors qu'à la troisième itération de ta boucle, on arrivera sur le Lieu2, qui sera différent de Lieu1 contenu dans la variable temporaire, et ton code affichera ce nouveau lieu et mettra à jour la variable temporaire et ainsi de suite... :)

Re: Crée csv depuis php

par xstevenetx » 01 avr. 2021, 19:04

Merci de ta réponse qui ma énormément aider.
Maintenant que mes colonnes sont crée avec le bon nom, j'aimerais savoir si il est possible de me mettre une seul fois le nom "lieu1", "lieu2"
J'ai actuellement :

Code : Tout sélectionner

Listes Écrans Lieu1 GCR-A1-001 Lieu1 GCR-A1-002 Lieu2 GCR-A1-003 Lieu2 GCR-A1-004 Lieu3 GCR-A1-005 Lieu3 GCR-A1-006
J'aimerais uniquement qui me note 1seul fois "lieu1" ,"lieu2"..... et ne rien mettre a la place.
Comme cela :
Listes           Écrans
Lieu1	GCR-A1-001
      GCR-A1-002
Lieu2 	GCR-A1-003
      GCR-A1-004
Lieu3	GCR-A1-005
       GCR-A1-006
Merci beaucoup

Re: Crée csv depuis php

par Ryle » 01 avr. 2021, 14:16

A chaque fois que tu vais appel à fputcsv(), tu vas générer une ligne de ton fichier csv. Les colonnes vont correspondre aux valeurs des tableaux que tu passes pour chaque ligne. Pour obtenir le résultat ci-dessus, il te faut donc constituer des tableaux qui auront cette forme : array ( 'Listes', 'Ecrans' ).

Il te faut donc construire un tableau de tableaux, dans lesquels tu mettras ces deux valeurs :
$lis = array();
...
$lis[] = array($liste, $ip); 
...
foreach ($lis as $fields){
  fputcsv($fp, $fields);
}

Re: Crée csv depuis php

par xstevenetx » 01 avr. 2021, 00:15

Bon ça avance.
Il me met bien les bons résultats mais tout en ligne en lieu de les mettre en colonne.
$lis = array();
$ecrans = array();
foreach($serveurs as $region => $info) {
        if (!empty($p_region) && ($p_region != $region)) continue; // si pas la région indiquée, on saute la boucle
        echo "<div id='{$region}'>";

        foreach($info['liste'] as $liste => $detail) {
                if (!empty($p_liste) && ($p_liste != $liste)) continue; // si pas la liste indique, on saute la boucle
				if ($detail['statut'] == "<img src=/". ("orange.gif") .">")
				{
                echo "<ul><a href='gares/$liste.php'>{$liste}</a></li><ul>";
				$lis[] = $liste;
				}
                foreach($detail['ip'] as $ip => $statut)
				if ($statut == "HS")
				{
                        echo "<li>{$ip}</li>";
						$ecrans[] = $ip;
				}
                echo "</ul></ul>";
        }
        echo "</div>";
}
$fp=fopen('serveur_HS.csv', 'w');
$list = array ($lis,$ecrans);
foreach ($list as $fields){
fputcsv($fp, $fields);
}
fclose($fp);
Resultat:
Lieu1,Lieu2,Lieu3
GCR-A1-001,GCR-A1-002,GCR-A1-003,GCR-A1-004,GCR-A1-005,GCR-A1-006

Comment faire pour faire deux colonnes?

Comme cela:
Listes           Écrans
Lieu1           GCR-A1-001
                 GCR-A1-002
Lieu2           GCR-A1-003
                  GCR-A1-004
Lieu3           GCR-A1-005
                  GCR-A1-006
Merci beaucoup

Re: Crée csv depuis php

par Ryle » 31 mars 2021, 11:20

Effectivement, dans ton code, tu as deux variables $lis et $ecran que tu écrases à chaque itération du foreach et ce n'est qu'après la boucle que tu vas lire leurs valeurs pour les mettre dans ton fichier... résultat, tu n'as que la dernière valeur de la boucle à chaque fois.

Commence par déclarer $lis et $ecran comme étant des tableaux avant de faire le foreach :
$lis = array(); 
$ecran = array();
Dans ta boucle, au lieu d'écraser les variables, ajoute tes valeurs dans ces tableaux
$lis[] = $liste; 
...
$ecran[] = $ip;
Tu obtiendras ainsi 2 tableaux en sortie de boucle avec respectivement ta liste et tes ip.

A toi de voir ensuite comment tu veux les utiliser pour produire ton fichier... Pour autant dans l'exemple que tu donnes, on est pas sur un fichier CSV mais sur un simple fichier plat. Tu pourrais donc écrire à l'intérieur au fur et à mesure de ta boucle :)

Re: Crée csv depuis php

par xstevenetx » 30 mars 2021, 22:44

j'aimerais un fichier comme sa environ

Code : Tout sélectionner

Lieu1 GCR-A1-001 GCR-A1-002 Lieu2 GCR-A1-003 GCR-A1-004 Lieu3 GCR-A1-005 GCR-A1-006
En imaginant bien sur qu'il soit tous HS

Re: Crée csv depuis php

par xstevenetx » 30 mars 2021, 22:34

Merci de ton aide!
J'ai fais quelques essayes et je n'arrive pas a aller plus loin.
<?php
include("commun.php");
// récupération d'info dans l'url pour filtrer
$p_region = isset($_GET['region']) ? $_GET['region'] : "Serveurs";
$p_liste = isset($_GET['liste']) ? $_GET['liste'] : "";

// parcours du tableau
foreach($serveurs as $region => $info) {
        if (!empty($p_region) && ($p_region != $region)) continue; // si pas la région indiquée, on saute la boucle
        echo "<div id='{$region}'>";

        foreach($info['liste'] as $liste => $detail) {
                if (!empty($p_liste) && ($p_liste != $liste)) continue; // si pas la liste indique, on saute la boucle
				if ($detail['statut'] == "<img src=/". ("orange.gif") .">")
				{
                echo "<ul><a href='liste/$liste.php'>{$liste}</a></li><ul>";
				$lis= $liste;
				}
                foreach($detail['ip'] as $ip => $statut)
				if ($statut == "HS")
				{
                        echo "<li>{$ip}</li>";
						$ecrans = $ip;
				}
                echo "</ul></ul>";
        }
        echo "</div>";
}
$fp=fopen('Serveur_HS.csv', 'w');
$lists = array (
array ("$lis"),
array ("$ecrans")
);
foreach($lists as $list){
fputcsv($fp, $list);
}
fclose($fp);
?>
Avec il me crée un fichier avec juste le dernier de chaque variable.
Merci de votre aide

Re: Crée csv depuis php

par Ryle » 29 mars 2021, 17:01

Salutations !

En fait, il te faut dans un premier temps créer le fichier csv que tu veux remplir, en mode écriture avec fopen('file.csv', 'w');

Tu vas ensuite pouvoir alimenter chaque ligne de ton csv avec fputcsv() en passant en paramètre un tableau dont chaque valeur correspondra à une colonne.
fputcsv($fp, array('valeurCelluleA', 'valeurCelluleB', 'valeurCelluleC', ); // alimentera la première ligne du fichier avec 3 colonnes.

Et il suffit de recommencer pour la ligne suivante en faisant à nouveau appel à ftputcsv et en lui indiquant les nouvelles valeurs. Tu peux pour cela profiter de ta boucle foreach pour alimenter plusieurs lignes du fichier.

Quant au tableau à passer en paramètre, tu peux comme ci-dessus le déclarer à la volée ou passer par une variable, en précisant dans celui-ci chacun des éléments que tu veux faire apparaitre dans les colonnes de ton fichier : par exemple array($region, $detail, $statut ...)

Donc 1. on ouvre le fichier, 2. on boucle sur les lignes à générer, 3. on met les valeurs souhaitées dans l'ordre, 4. on ferme le fichier ;)

Re: Crée csv depuis php

par xstevenetx » 29 mars 2021, 12:47

Merci de ta réponse, j'ai bien compris qu'il fallait que je fasse un "array" pour pouvoir le générer en CSV mais malheureusement je ne sais pas ou et comment le crée.
Un petit coup de main ne serais pas de refus.
Merci d'avance

Re: Crée csv depuis php

par or 1 » 28 mars 2021, 18:46

voir l'exemple :
https://www.php.net/manual/fr/function.fputcsv.php
pour l'instant, le code ne fait que des echos. il faut pour pouvoir faire une sortie html et une sortie csv, générer un tableau php, et ensuite parcourir ce tableau pour générer soit de l'html, soit du csv.

Crée csv depuis php

par xstevenetx » 28 mars 2021, 14:06

Bonjour j'aimerais crée un fichier CSV depuis les résultats trouver dans une page php.
Je m'explique :
Mon script ouvre d'abord un fichier serveur.csv qui liste par region, ip et statut
Serveurs.csv

Code : Tout sélectionner

region liste serveur statut Secteur1 Lieu1 GCR-A1-001 OK Secteur1 Lieu1 GCR-A1-002 HS Secteur1 Lieu2 GCR-A1-003 OK Secteur1 Lieu2 GCR-A1-004 OK Secteur1 Lieu3 GCR-A1-005 OK Secteur1 Lieu3 GCR-A1-006 HS
Le script me prend QUE les statuts HS et me les listes sur une page

ServeurHS.php
<?php
include("commun.php");
// récupération d'info dans l'url pour filtrer
$p_region = isset($_GET['region']) ? $_GET['region'] : "SecteurA";
$p_liste = isset($_GET['liste']) ? $_GET['liste'] : "";

// parcours du tableau
foreach($serveurs as $region => $info) {
        if (!empty($p_region) && ($p_region != $region)) continue; // si pas la région indiquée, on saute la boucle
        echo "<div id='{$region}'>";

        foreach($info['liste'] as $liste => $detail) {
                if (!empty($p_liste) && ($p_liste != $liste)) continue; // si pas la liste indique, on saute la boucle
				if ($detail['statut'] == "<img src=/". ("orange.gif") .">")
				{
                echo "<ul><a href='liste/$liste.php'>{$liste}</a></li><ul>";
				}
                foreach($detail['ip'] as $ip => $statut)
				if ($statut == "HS")
				{
                        echo "<li>{$ip}</li>";
				}
                echo "</ul></ul>";
        }
        echo "</div>";
}
?>
Tout fonctionne parfaitement.
Maintenant j'aimerais prendre ses résultats et les mettre dans un fichier csv qui serais téléchargeable si on le souhaite avec un bouton par exemple.

J'ai essayer de me renseigner avec la fonction "fputcsv" mais j'ai vraiment du mal.

Merci d'avance.