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

Langage PHP Discussion :

Recherche récursive dans 3 fichiers


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Points : 132
    Points
    132
    Par défaut Recherche récursive dans 3 fichiers
    Bonjour,

    Savez vous s'il existe une fonction ou comment optimiser une recherche récursive dans 3 fichiers ?

    J'ai un code qui fonctionne mais sur de gros fichier je vais avoir un timeout.

    L'algo est le suivant :

    Je prend mon fichier 1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $AssetExtractFilename = $RootPath."\Datas\Extract\ASSET.txt";
    Je le lis, ligne par ligne avec ma fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $champs_array = ReadExtract($AssetExtractFilename);
    J'extrais le champs 8 qui est le nom de mon serveur :

    Ensuite je vais voir dans mon fichier 2 si mon serveur (extrait en champs 8, fichier1) existe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $champs_array = ReadExtract($SCCMExtractFilename);
    Et enfin je vais voir dans mon fichier 3 si mon serveur (extrait en champs 8, fichier1) existe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $champs_array = ReadExtract($CASExtractFilename);
    A la fin je fait un tableau : fichier 1 existe oui/non, fichier 2 existe oui/non, , fichier 3 existe oui/non.

    Ce qui donne ça :

    FONCTION :

    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
     
    // FONCTION : lecture du fichier et création d'un array multi-dimension
    function ReadtExtract($Filename)
    {
    	$champs_array = array();
    	$lines_array = file($Filename); 
    	// on supprime la 1ère ligne (celle contenant les titres)
    	unset($lines_array[0]);
    	// on sépare ensuite les éléments de chaque ligne
    	foreach($lines_array as $line)
           {
    		//on enlève les " et espaces (surtout à la fin de la ligne)
    		$line = trim(str_replace('"', '', $line));
    		//on coupe a chaque ;
    		$champs_array[] = explode(";", $line);
    	}
    	return $champs_array;
    }
    PARCOURS DES FICHIERS (Pour l'exemple j'ai mis que 2 fichiers) :

    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
     
    $champs_array = ReadExtract($AssetExtractFilename);
     
    foreach($champs_array as $champsASSET)
    {
    	if (!empty($champsASSET[8])) 
    	{
    		$MaRecherche = $champsASSET[8];
    		$champs_array = ReadExtract($SCCMExtractFilename);
    		foreach($champs_array as $champsSCCM)
    		{
    			if (!empty($champsSCCM[1])) 
    			{
    				if (strcasecmp(trim($MaRecherche),trim($champsSCCM[1])) == 0)
    				{
    					echo $champsSCCM[1]."<br>";
    				}
     
    			}
    		}
     
    	}
    }
    Merci d'avance pour votre aide précieuse.

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Points : 132
    Points
    132
    Par défaut
    du coup je fais un set_time_limit (0) pour le moment, mais à l'affichage c'est long ... Je ne vois pas comment faire, merci.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Tu cherches juste à savoir SI le champ existe dans le fichier.

    Donc : une fois que tu l'as trouvé, inutile de continuer à chercher.
    Il faut mettre dans la boucle un :
    Dans ce genre :
    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
    $champs_array = ReadExtract($AssetExtractFilename);
    foreach($champs_array as $champsASSET)
    {
    	$find1 = false;
    	if (!empty($champsASSET[8])) 
    	{
    		$MaRecherche = $champsASSET[8];
    		$champs_array = ReadExtract($SCCMExtractFilename);
    		foreach($champs_array as $champsSCCM)
    		{
    			if ( !empty($champsSCCM[1]) && strcasecmp(trim($MaRecherche),trim($champsSCCM[1])) == 0)
    			{
    				echo $champsSCCM[1]."<br>";
    				$find1 = true; // trouvé !
     
    			}
    			if($find1) break; // on sort du foreach
    		}
    	}
    }
    Ca devrait méchamment booster la recherche.
    Dernière modification par Invité ; 31/08/2013 à 13h07.

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Points : 132
    Points
    132
    Par défaut
    c'est simple mais je n'y avais pas pensé

    Merci jérome je test ca

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Points : 132
    Points
    132
    Par défaut
    bon et bien c'est pas bcp mieux

    C'est un fichier de 9000 lignes donc je vais voir comment optimiser ça.

    Faire un premier découpage équipes par équipes, etc ....

  6. #6
    Invité
    Invité(e)
    Par défaut
    Tu ne crois pas qu'il serait temps d'installer une base de données ?

    Comme son nom l'indique, ça sert à ça... stocker/gérer/traiter des données.

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Points : 132
    Points
    132
    Par défaut
    je ne voulais pas mais je vais bientôt être obligé. En fait mes fichiers textes sont des extracts des bases de plusieurs référentiels ... Je vais voir. Merci encore en tout cas

  8. #8
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    Pour traiter des fichiers texte volumineux (enfin 9000 lignes c'est pas beaucoup), tu peux utiliser fgetcsv() qui lit la source que ligne par ligne.

  9. #9
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Points : 132
    Points
    132
    Par défaut
    Bonsoir à tous,

    J'ai fait plusieurs test pour optimiser les temps de réponse sur un fichier de 200 lignes.

    J'ai un formulaire avec un textarea dans lequel je copie/colle mes 200 machines à rechercher :

    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
     
     
    echo "<form class = action='index.php?page=TEST' method='post'>		
    			<table>
    			<tr><td>Select repository</td></tr>
    				<tr>
    				<td><input type='radio' name='Repository' value='".$AssetExtractFilename."' checked>ASSET
    				<input type='radio' name='Repository' value='".$SCCMExtractFilename."'>SCCM
    				<input type='radio' name='Repository' value='".$CASExtractFilename."'>CAS</td>
    				</tr>
    				<tr><td><textarea name='adv_search_list' /></textArea></td></tr>
     
    				<tr><td><input class='bt bt_bleu' name='adv_search' type='submit' value='Advanced Search !'></td></tr>
    			</table>
    	</form>";
    J'ai ma fonction, qui va lire mon fichier source :



    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
     
    //FONCTION 2
    function ExtractSpeed($Filename,$srv)
    {
    	$lines= explode("\n",$Filename);
     
    	foreach($lines as $line)
    	{
     
    		$line = trim(str_replace('"', '', $line));	
    		$champs = explode(";", $line);
     
    		if (strcasecmp(trim($srv),trim($champs[8])) == 0)
    		{	
    			$tabinfo = "<tr><td>".$count."</td><td>".$champs[19]."</td><td>". $champs[21]."</td><td>". $champs[5]."</td><td>". $champs[8]."</td><td>". $champs[6]."</td><td>". $champs[7]."</td><td>". $champs[2]."</td><td>". $champs[14]."</td></tr>";
    			return($tabinfo);			
    		}
     
    	}
     
    }
    Et j'execute ma fonction quand je valide mon formulaire :

    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
     
    if (isset($_POST['adv_search']))
    {
     
    	$tableauasset = file_get_contents($_POST['Repository']);
     
    	$temps = microtime();
    	$temps = explode (" ", $temps);
    	$temps = $temps[1] + $temps[0];
    	$chrono_start = $temps;
     
    	$servers= Trim($_POST['adv_search_list']);
    	$serveur = explode("\n",$servers);
     
    	set_time_limit (0);
    	foreach ($serveur as $value)
    	{
    		$assetinfo .= ExtractSpeed($tableauasset,$value);
    		$data = array($assetinfo);
    	}
     
    	$TableBody .= implode('', $data);
    	echo  $TableHeader.$TableBody.$TableBottom;
     
    	$temps = microtime();
    	$temps = explode(" ", $temps);
    	$temps = $temps[1] + $temps[0];
    	$chrono_finish = $temps;
    	$temps_generation = $chrono_finish - $chrono_start;
    	echo "Execution time : ".number_format($temps_generation, 4, ",", "")." seconds.";
     
    }
    Avec cette fonction, j'affiche un résultat en 18 secondes comparé à cette autre fonction plus propre (Merci Jérome) mais plus longue car affichage en 84 secondes :

    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
     
    //FONCTION 3
    function ExtractLent($Filename)
    {
    	$champs_array = array();
    	$lines_array = file($Filename); // mettre le CHEMIN correct vers le fichier
    	// on supprime la 1ère ligne (celle contenant les titres)
    	unset($lines_array[0]);
    	// on sépare ensuite les éléments de chaque ligne
    	foreach($lines_array as $line){
    		//on enlève les " et espaces (surtout à la fin de la ligne)
    		$line = trim(str_replace('"', '', $line));
    		//on coupe a chaque ;
    		$champs_array[] = explode(";", $line);
    	}
    	return $champs_array;
    }
    Savez vous comment je peux optimiser le code de ma fonction ExtractSpeed car je trouve ca dégueux pour le moment

    Le but est de prendre les serveurs postés dans mon textarea un par un, puis de lire mon fichier pour voir si le serveur existe en champs 8 te de creer un beau tableau.

    Si vous avez des pistes je suis preneur je vais également voir pour ajouter fgetcsv() car c'es un fichier csv.

    Merci d'avance à vous.

  10. #10
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Allez, ça devrait être plus ou moins instantané :
    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
    function prepare_repository($repository)
    {
        $repos = array('asset', 'sccme', 'case');
        // on vérifie que $repository est valide
        if (in_array($repository, $repos, true) && is_file($repository))
        {
            $source = explode("\n", str_replace('"', '', file_get_contents($repository)));
            $data   = array();
            foreach ($source as $row)
            {
                // je considère que $values[8] est unique
                $values           = array_map('trim', explode(';', $row));
                $data[$values[8]] = $values;
            }
     
            return $data;
        }
        else
        {
            return false;
        }
    }
     
    if (isset($_POST['adv_search']))
    {
        if (empty($_POST['Repository']) || empty($_POST['adv_search_list']))
        {
            echo 'erreur...';
            exit;
        }
     
        $repository = prepare_repository($_POST['Repository']);
     
        if ($repository === false)
        {
            echo 'erreur...';
            exit;
        }
     
        $table_body = array();
        $servers    = array_flip(array_map('trim', explode("\n", $_POST['adv_search_list'])));
        // ici on fait la comparaison sur la colonne 8 de repository
        $found      = array_intersect_key($servers, $repository);
     
        // échappement des caractères à l'affichage
        $hsc = function($p) { return htmlspecialchars($p, ENT_QUOTES, 'utf-8'); };
     
        foreach ($found as $server => $v)
        {
            $table_body[] =
    <<<HTML
    <tr>
        <td>0</td>
        <td>{$hsc($repository[$server][19])}</td>
        <td>{$hsc($repository[$server][21])}</td>
        <td>{$hsc($repository[$server][5])}</td>
        <td>{$hsc($repository[$server][8])}</td>
        <td>{$hsc($repository[$server][6])}</td>
        <td>{$hsc($repository[$server][7])}</td>
        <td>{$hsc($repository[$server][2])}</td>
        <td>{$hsc($repository[$server][14])}</td>
    </tr>
    HTML;
        }
     
        echo $TableHeader, implode('', $table_body), $TableBottom;
    }
    Comme toujours ça sort du four, rien testé. J'ai pas compris ton $count dans ta fonction ExtractSpeed()

  11. #11
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Points : 132
    Points
    132
    Par défaut
    Merci rawsrc

    J'ai un
    Parse error: syntax error, unexpected T_FUNCTION
    à cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // échappement des caractères à l'affichage
        $hsc = function($p) { return htmlspecialchars($p, ENT_QUOTES, 'utf-8'); };
    mais je ne vois pas pourquoi

  12. #12
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    ça sent un problème de version de PHP
    Quelle version de PHP utilises-tu en prod ?

    Pour que mon code fonctionne tu dois l'exécuter sur du PHP 5.3+ minimum

    au pires tu commentes la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    // $hsc = function($p) { return htmlspecialchars($p, ENT_QUOTES, 'utf-8'); };
    et tu corriges légèrement le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            $table_body[] =
    <<<HTML
    <tr>
        <td>0</td>
        <td>{$repository[$server][19]}</td>
        <td>{$repository[$server][21]}</td>
        <td>{$repository[$server][5]}</td>
        <td>{$repository[$server][8]}</td>
        <td>{$repository[$server][6]}</td>
        <td>{$repository[$server][7]}</td>
        <td>{$repository[$server][2]}</td>
        <td>{$repository[$server][14]}</td>
    </tr>
    HTML;

  13. #13
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Points : 132
    Points
    132
    Par défaut Recherche récursive dans des ficheirs volumineux, sans BDD.
    Bonjour,

    Je reexplique mon problème depuis le début

    Merci à Martin et à jérome pour leur aide depuis le début.

    Ca fonctionne merci, mais pour rechercher dans mes 3 fichiers c'est encore trop long et j'ai un timeout

    J'ai 3 fichiers CSV, qui sont en fait des extracts de 3 bases de données différentes, etc.

    Avec des champs, différents, etc.

    L'information commune aux 3 fichiers est le nom du serveur.

    Fichier1 : ExtractAsset.csv (Fichier de référence) --> 9000 lignes.
    Fichier2 : ExtractSCCM.csv --> 8000 lignes.
    Fichier3 : ExtractBMC.csv --> 5000 lignes.
    Fichier1 : ExtractAsset.csv
    ID;OS;IP;BACKUP;TEAM;RAM;INSTALLATION;SERVER_NAME
    1;W2003;192.168.0.1;YES;SYS;4;2013;MONSERVEUR1
    2;W2003;192.168.0.2;YES;DBA;2;2011;MONSERVEUR2
    3;W2008;192.168.0.3;NO;SYS;12;2010;MONSERVEUR3
    4;W2003;192.168.0.4;YES;LINUX;4;2013;MONSERVEUR4
    5;W2012;192.168.0.5;NO;SYS;8;2012;MONSERVEUR5
    6;W2003;192.168.0.6;YES;DBA;4;2013;MONSERVEUR6
    ....
    9000 lignes.

    Fichier2 : ExtractSCCM.csv
    SERVER_NAME;OS;IP;TEAM;CLIENT_VERSION
    MONSERVEUR1;Windows2003;192.168.0.1;1.0
    MONSERVEUR2;Windows2003;192.168.0.2;1.0
    MONSERVEUR3;Windows2008;192.168.0.3;1.0
    MONSERVEUR7;Windows2008;192.168.0.7;1.0
    MONSERVEUR8;Windows2008;192.168.0.8;1.0
    ...
    8000 lignes.

    Fichier3 : ExtractBMC.csv
    IP;SERVER_NAME;AGENT_STATUS
    192.168.0.1;MONSERVEUR1;ALIVE
    192.168.0.12;MONSERVEUR12;ALIVE
    192.168.0.13;MONSERVEUR13;DOWN
    ...
    5000 lignes.
    Le but est donc de prendre le fichier de référence : Fichier1 : ExtractAsset.csv.

    De lire le fichier ligne par ligne.
    D'extraire le champs n°7 qui est le nom du serveur.

    Ensuite avec ce nom de serveur, je vais dans mon Fichier2 : ExtractSCCM.csv
    Et je recherche s'il existe, en comparant avec le champs n°0 qui est le nom du serveur également.

    Idem pour le Fichier3 : ExtractBMC.csv
    Je prends mon nom de serveur extrait en champs 7 (Fichier 1) et je regarde s'il existe dans mon fichier 3 en comparant avec le champs n°1

    Ainsi à partir du fichier 1 je créer un tableau html.

    ASSET SERVER;SCCM SERVER;BMC SERVER
    MONSERVEUR1;EXISTE;EXISTE
    MONSERVEUR2;EXISTE;EXISTEPAS
    MONSERVEUR3;EXISTE;EXISTEPAS
    MONSERVEUR4;EXISTEPAS;EXISTEPAS
    MONSERVEUR5;EXISTEPAS;EXISTEPAS
    MONSERVEUR6;EXISTEPAS;EXISTEPAS
    J'arrive à le faire en passant une liste de machines(Essayé avec 200 machaines ok)en paramètres depuis un formulaire.

    Mais je souhaiterais parcourir l'ensemble de mon fichier 1 soit 9000 machines.

    Je ne sais pas si c'est possible d'optimiser ce type de recherche sans BDD.

    Merci d'avance pour votre aide, car c'est la fin de mon site.

    Je voudrais une page globale avec ma liste des serveurs afin de voir s'il est présent dans les 3 référentiels

    Merci encore, j'espere etre assez clair.

  14. #14
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 49
    Points : 95
    Points
    95
    Par défaut
    Bonjour !

    Une petite idée me vient à l'esprit... Je m'explique :
    Lit tes fichier un par un. Pour chaque fichier, construit un tableau php avec uniquement le serveur de chaque ligne (en gros pour ton fichier 1 : ton tableau PHP = la colonne 7 de ton fichier)

    Après ce traitement tu n'aura lu qu'une seule fois chaque fichier (donc assez peu gourmand niveau temps avec la fonction de rawsrc) et tu aura un tableau PHP par fichier.

    Il te suffit ensuite de parcourir le tableau de ton fichier 1 et de vérifier (avec cette fonction par exemple) si le serveur du fichier 1 actuellement parcouru existe dans le tableau du fichier 2 et du fichier 3.

    Avec les résultats, fait comme tu veux, moi j'opterais pour l'affichage directement ou la construction d'un tableau final de résultat (si tu veux faire autre chose que l'afficher).

    Avec cette algo, tu ne lira qu'une seule fois chaque fichier, et le traitement devrait être assez rapide (si des connaisseurs peuvent confirmer ça).

  15. #15
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    il faudrait que tu poses un chrono sur la fonction prepare_repository(), histoire de savoir dans quelle proportions l'acquisition des données accapare les ressources.
    En fonction de cette valeur, tu sauras si c'est jouable de s'affranchir d'une base de données sur ton système.

  16. #16
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Points : 132
    Points
    132
    Par défaut
    hello,
    Ok martin, j'ai mis un chrono, et tester sur une recherche de 500 machines en 3 secondes ça s'affiche

    Cependant, comment faire pour prendre toutes les machines de mon fichier au lieu de prendre uniquement les serveurs tapés dans le formulaire.

    J'ai fait ca pour tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    	$serversTest = file_get_contents($AssetExtractFilename);
     
    	$serveur= explode("\n",$serversTest);
    	foreach($serveur as $value)
    	{
    		$value = trim(str_replace('"', '', $value));
    		$Srv = explode(";", $value);
    		//echo $Srv[8]."<br><br>";
     
     
    		$servers    = array_flip(array_map('trim',$Srv[8] ));
     
    	}
    Mais j'ai une erreur sur le array_map/array_flip :
    Warning: array_map() [function.array-map]: Argument #2 should be an array ...
    Merci d'avance

  17. #17
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    J'ai pas tout compris : tu veux maintenant injecter la liste des serveurs à vérifier depuis un fichier ?

    Par ailleurs, y a un truc qui me chiffonne, j'ai fait un essai sur un fichier csv de 10 000 lignes sur 5 colonnes et j'obtiens un temps de chargement assez stable de l'ordre de 0.16 seconde pour 10 Mo, comme tu peux le voir je suis assez loin de tes temps.

  18. #18
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Points : 132
    Points
    132
    Par défaut
    Je t'ai répondu par MP Merci à toi.

    J'ai changé mon pseudo au passage

  19. #19
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Points : 132
    Points
    132
    Par défaut
    Merci à toi également clement, je vais voir avec martin dasn un premier temps et apres je passerai par ta solution, un fichier temps si ca ne fonctionne pas ...

  20. #20
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    je poste le code envoyé à snorky94 :
    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
    <?php 
     
    $start = 0;
    $end   = 0;
     
    $start = microtime(true);
     
    $asset = array();
    $fh    = fopen('ASSET.csv', 'r');
    fgetcsv($fh, 1024, ';', '"'); // saut de l'en-tête
    while (($row = fgetcsv($fh, 1024, ';', '"')) !== false)
    {
        // les serveurs sans id sont ignorés
        if ( ! empty($row[8]))
        {
            $asset[$row[8]] = $row;
        }
    }
    fclose($fh);
     
    $cas = array();
    $fh  = fopen('CAS.csv', 'r');
    fgetcsv($fh, 1024, ';', '"'); // saut de l'en-tête
    while (($row = fgetcsv($fh, 1024, ';', '"')) !== false)
    {
        // les serveurs sans id sont ignorés
        if ( ! empty($row[0]))
        {
            $cas[$row[0]] = true;
        }
    }
    fclose($fh);
     
    $sccm = array();
    $fh   = fopen('SCCM.csv', 'r');
    fgetcsv($fh, 1024, "\t", '"'); // saut de l'en-tête
    while (($row = fgetcsv($fh, 1024, "\t", '"')) !== false)
    {
        // les serveurs sans id sont ignorés
        if ( ! empty($row[1]))
        {
            $sccm[$row[1]] = true;
        }
    }
    fclose($fh);
     
    $table_body = array();
     
    foreach ($asset as $server_id => $details)
    {
        $in_sccm      = (isset($sccm[$server_id])) ? 'OUI' : 'NON';
        $in_cas       = (isset($cas[$server_id]))  ? 'OUI' : 'NON';
        $table_body[] =
    <<<HTML
    <tr>
        <td>{$server_id}</td>
        <td>{$in_sccm}</td>
        <td>{$in_cas}</td>
    </tr>
    HTML;
    }
     
    $end = microtime(true);
    echo 'Script duration : ', ($end - $start), ' seconds';
    // Résultats obtenus :
    // Script duration : 1.4300820827484 seconds
    // Script duration : 1.4310820102692 seconds
    // Script duration : 1.4270820617676 seconds
    // Script duration : 1.4280819892883 seconds
     
    // echo $TableHeader, implode('', $table_body), $TableBottom;

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/06/2009, 17h49
  2. Recherche Occurance dans un fichier Txt
    Par spirit daemon dans le forum Débuter
    Réponses: 5
    Dernier message: 29/11/2007, 22h10
  3. Recherche/Replace dans un fichier RTF (VB2005)
    Par npenel dans le forum VB.NET
    Réponses: 5
    Dernier message: 27/11/2007, 14h59
  4. Recherche/Replace dans un fichier RTF (VB2005)
    Par npenel dans le forum Windows
    Réponses: 3
    Dernier message: 27/11/2007, 10h39
  5. Recherche chaine dans un fichier
    Par matt8-5 dans le forum Langage
    Réponses: 2
    Dernier message: 02/11/2006, 16h07

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