Exploitation d'un .csv[résolu]

Petit nouveau ! | 5 Messages

11 mai 2011, 09:25

Bonjour,

Je bloque sur un problème d'exploitation de .csv. J'ai un fichier .csv de la forme suivante :
30/03/2011 13:49;WXFR90145L;Latitude D630;112XB3J
25/03/2011 05:05;WXFR67272D;Precision WorkStation 490;11HX33J
08/04/2011 14:43;ITA011;OptiPlex GX280;11WZK1J
21/06/2010 17:11;MAR030;SP6000;12141589G
06/08/2010 11:41;WXFR65035D;OptiPlex GX520;122KH2J
30/10/2009 09:04;WXFR83008L;Latitude D610;12RZV1J
Je n'arrive pas à exploiter ce tableau avec array multisort pour qu'il me le classe par date et par numero de serie ( le dernier champ ). Je voudrai trier ce tableau et pouvoir le ré-exploiter par la suite avec d'autre commandes php. Pouvez vous m'indiquer la démarche à suivre ou me dire si c'est possible? Je galère pas mal dessus et je n'arrive pas à comprendre la fonction definie sur php manual.

Merci d'avance pour vos conseils.
Modifié en dernier par GuillaumeC le 16 mai 2011, 09:44, modifié 1 fois.

ViPHP
ViPHP | 5462 Messages

11 mai 2011, 11:19


Petit nouveau ! | 5 Messages

11 mai 2011, 11:34

J'ai peut être mal exprimé mon besoin..

Je part d'un fichier .csv.
J'aimerai le classer par date et numéro de série. ( donc soit le ranger dans un tableau ( tableau A ) en php, soit dans ma bdd, je bloque encore sur la solution )

Une fois ce tableau obtenu, ranger tout les numéros de série vides dans un autre tableau (disons tableau B ) que je sortirai dans un fichier .csv, et les retirer du tableau sur lequel je travaille ( tableau A ). Ensuite ranger tout les numéros de série doublons et ne garder que les plus recent ( donc supprimer tout les couples date-numerodesérie plus vieux que le plus recent couples date-numerodesérie).

Je veux donc avoir un code qui supprime tout les numéros de série vide et ne pas avoir de doublons sur les numéros de série par rapport a la date.

Je sais lire un fichier .csv avec php, c'est son exploitation qui pose problème. Pensez vous que ce la meilleure solution serait d'exploiter la bdd ou de travailler sur des tableaux en php? Je travaille actuellement sur la premiere solution, mais j'avance tres doucement.


... je viens de voir votre réponse stealth35, si je ne me trompe pas cela rejoins donc la manipulation de donnée apres l'insertion. Est-ce la meilleure méthode pour un tri de donnée?

ViPHP
ViPHP | 5462 Messages

11 mai 2011, 12:06

Est-ce la meilleure méthode pour un tri de donnée?
c'est la plus simple a utiliser

Petit nouveau ! | 5 Messages

11 mai 2011, 15:44

Je teste la pdo, et je commence par l'affichage des données que j'ai inseré, mais mon code php ne marche pas. Est-il faux ou manque t-il des librairies?

J'ai décommenté les ;extensions_dir concernant la pdo dans php.ini .


try
{

    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
	
    $bdd = new PDO('mysql:host=localhost;dbname=bdd', 'root', 'pass', $pdo_options);



    $reponse = $bdd->query('SELECT * FROM description_ordinateur');

    while ($donnees = $reponse->fetch())
    {
    
    echo $donnees['Num_Serie_Ordi']; // j'affiche un seul champ pour tester
       
    }
    
    $reponse->closeCursor();

}
catch(Exception $e)
{

    die('Erreur : '.$e->getMessage());
}

L'insertion se déroule très bien :
include ("accesbdd.php");

$row = 0;
$handle = fopen("test.csv", "r");

while(($data = fgetcsv($handle, 1000, ";")) !== FALSE)


{

	
	$data_description="SELECT * FROM description_ordinateur WHERE IDreseau_ord='$data[1]' AND Num_Serie_Ordi='$data[3]' ";

	$get_result=mysql_query($data_description);
	$nbligne=mysql_num_rows($get_result); 
	$result_tableau=mysql_fetch_array($get_result); 
	
	$data_date=substr($data[0], 0, 10);
	
	$champ1 = substr($data_date, 0, 2) ; 
	$champ2 = substr($data_date, 3, 2) ; 
	$champ3 = substr($data_date, 6, 4) ; 
	
	$date=$champ3.'-'.$champ2.'-'.$champ1;
	
	

	if($nbligne>0)
	
		{ 	
			echo"test";
                        // futur commande d'update
		}
		
	else
	
		{   
		
				
				$insertion = "INSERT INTO description_ordinateur (Num_Serie_Ordi, IDreseau_ord, Type_ord, Date_changement_statut_ord) VALUES('$data[3]', '$data[1]', '$data[2]', '$date')";
				$execute=mysql_query($insertion) OR die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
				
								
		
		}	
				

}

mysql_close();

ViPHP
ViPHP | 5462 Messages

11 mai 2011, 15:48

tu mélanges 2 extensions la

Petit nouveau ! | 5 Messages

11 mai 2011, 15:51

Je sais je n'utilise pas la pdo pour l'insertion, je l'avais déjà écrit avant de poster.

EDIT : si l'autre extension est sqlite, j'ai aussi decommenté sa ligne dans php.ini .

ViPHP
ViPHP | 2577 Messages

11 mai 2011, 16:19

Bonjour,

Lors du chargement du fichier, tu peux mettre les lignes dans le tableau qui convient (tableau avec numero ou sans numero)

Pour le tableau avec numéro, tu prends comme clé le numéro de série. Avant d'ajouter un élément tu regardes si l'élément avec le numero de série existe (doublon) auquel cas tu compares les dates pour savoir si tu écrases ou pas. Si le numéro n'existe pas tu ajoutes l'élément.

Pour le tableau sans numéro de série, tu procèdes de manière analogue en utilisant une clé numérique.

Avant de réécrire les fichiers CSV, tu utilise usort() pour trier les tabeaux si nécessaire.

Petit nouveau ! | 5 Messages

16 mai 2011, 09:43

J'ai résolu mon problème, voici ma solution.
<?php

include ("accesbdd_dev.php");

// ouvre le fichier test.csv en lecture seule
$handle = fopen("test2.csv", "r");
$datejour = date('d-m-Y');


$fichier_anomalie='anomalie(s)'.'_'.$datejour.'.csv' ;

$temp =" CREATE TABLE temp_sn (IDreseau_ord varchar(15), type_ord varchar(40), last_date date) " ;
$create = mysql_query($temp);

while(($data = fgetcsv($handle, 1000, ";")) !== FALSE)
// commence a la premiere ligne et s'incremente a chaque sortie de boucle

	{
		
		// si le numéro de série est vide, alors on le range directement dans un fichier anomalie
		if($data[3]=='0' || $data[3]=='')
			
			{
				
				$data_vide = " SELECT * FROM temp_sn WHERE IDreseau_ord='$data[1]' " ; // on recupere les id_reseau
				$get_result = mysql_query($data_vide); 
				$nbligne = mysql_num_rows($get_result);
				$result_tableau = mysql_fetch_array($get_result);
				
				$data_date = substr($data[0], 0, 10); // recuperation du champ JJ/MM/AAAA du champ date de la variable $date[0]
				
				$champ1 = substr($data_date, 0, 2) ; // recuperation du champ JJ de la variable $data_date
				$champ2 = substr($data_date, 3, 2) ; // recuperation du champ MM de la variable $data_date
				$champ3 = substr($data_date, 6, 4) ; // recuperation du champ AAAA de la variable $data_date
	
				$date = $champ3.'-'.$champ2.'-'.$champ1; // concaténation pour le format MySQL	
				
				
				if($nbligne>0)// si la ligne existe, on va comparer la ligne presente et la ligne ou se trouve le pointeur
	 
					{ 	
					
								
						if($result_tableau[2]<=$date)
						{
							/* je trie directement par identifiant reseau si le numéro de série est vide, ne pouvant exploiter un ID reseau relié un 
							modèle  */
							$upd = " UPDATE temp_sn SET last_date = '$date'  WHERE IDreseau_ord='$data[1]' " ;
							$sql = mysql_query($upd);
							
						}
							
							
					}
		
				else
	
					{   
				
						//si aucune ligne ne correspond au couple on fait une insertion dans la base de donnée
					
							
						$ins = "INSERT INTO temp_sn (IDreseau_ord, Type_ord, last_date) VALUES ('$data[1]', '$data[2]', '$date')";
						$sql = mysql_query($ins) OR die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
							
					
					
		
					}	

				
								
			}
	
	
		//sinon rangement dans la base MySQL
		if($data[3]!='0' && $data[3]!='')
			
			{
				
				
		
				//création de la requete SQL 
				$data_sn = "SELECT * FROM description_ordinateur WHERE Num_Serie_Ordi='$data[3]' ";

				$get_result = mysql_query($data_sn); // cherche champs num_serie_ord dans la base MySQL qui correspondent à la valeur désignée 
				$nbligne = mysql_num_rows($get_result); // on récupère le nombre de ligne renvoyées par le resultat de $get_result avec mysql_nums_rows
				// ici un seul champ peut être trouvé
				$result_tableau = mysql_fetch_array($get_result); // on met les données dans une ligne crée par les champs de la table description_ordinateur
	
				$data_date = substr($data[0], 0, 10); // recuperation du champ JJ/MM/AAAA du champ date de la variable $date[0]
				
				$champ1 = substr($data_date, 0, 2) ; // recuperation du champ JJ de la variable $data_date
				$champ2 = substr($data_date, 3, 2) ; // recuperation du champ MM de la variable $data_date
				$champ3 = substr($data_date, 6, 4) ; // recuperation du champ AAAA de la variable $data_date
	
				$date=$champ3.'-'.$champ2.'-'.$champ1; // concaténation pour le format MySQL	
	
				
				if($nbligne>0)// si la ligne existe, on va comparer la ligne presente et la ligne ou se trouve le pointeur
	 
					{ 	
					
							
		
						if($result_tableau[7]<=$date)
						{
							
							$upd = " UPDATE description_ordinateur SET IDreseau_ord = '$data[1]', Date_changement_statut_ord = '$date'  WHERE Num_Serie_ordi='$data[3]' " ;
							$sql = mysql_query($upd);
														
						}
							
							
					}
		
				else
	
					{   
				
						//si aucune ligne ne correspond au couple on fait une insertion dans la base de donnée
					
							
						$ins = "INSERT INTO description_ordinateur (Num_Serie_Ordi, IDreseau_ord, Type_ord, Date_changement_statut_ord) VALUES('$data[3]', '$data[1]', '$data[2]', '$date')";
						$sql = mysql_query($ins) OR die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
							
					
					
		
					}	
				
				$data_id = "SELECT * FROM description_ordinateur WHERE IDreseau_ord='$data[1]' ";
				$get_result = mysql_query($data_id); // cherche champs IDreseau_ord dans la base MySQL
				$result_tableau = mysql_fetch_array($get_result); // on met les données dans une ligne crée par les champs de la table description_ordinateur
				$nbr=1;
				
				while($ligne=mysql_fetch_row($get_result))
				{
					if($result_tableau[7]<$date)
						{
							
							$upd = " UPDATE description_ordinateur SET OLD = '$nbr' WHERE Date_changement_statut_ord='$result_tableau[7]' AND IDreseau_ord='$data[1]' " ;
							$sql = mysql_query($upd);
							$nbr++;
														
						}

										
				}
												
			}
	}

// je vais selectionner toutes les lignes de ma table temp_sn
$sel = " SELECT * FROM temp_sn " ; 
$sql = mysql_query($sel);
// je lis les lignes une par une tant que je n'arrive pas à la fin
while($ligne=mysql_fetch_row($sql))

	{
	
		// ajout dans le fichier anomalie
		$anomalie = fopen($fichier_anomalie, 'at');
		fputcsv($anomalie, $ligne, ";"); 
		fclose($anomalie);
		
	}




// je supprime la table temporaire
$sup_temp = " DROP TABLE temp_sn " ;
$drop = mysql_query($sup_temp) ;

mysql_close();
// message de test de fin d'execution
echo " Init terminé " ;


?>