Extraire des données mysql vers des fichiers texte

dgdev -  
-helper- Messages postés 89 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
depuis des heures je cherche comment faire pour extraire 90000 enregistrements d'une base mysql vers des fichiers en contenant respectivement 1000 chacun. Après opération, je dois obtenir 90 fichiers texte de 1000 lignes.
Merci par avance de votre aide,
DgDev


A voir également:

2 réponses

loupix57 Messages postés 316 Date d'inscription   Statut Membre Dernière intervention   14
 
ok, j'aurais tendance à dire cela :

$i=0;
$j=0;
$fichier = "mon_fichier";
$rep = mysql_query("ta_requete");
while($data=mysql_fetch_assoc($rep)){
$mon_fichier = $fichier.$j.".txt";
$hand = fopen($mon_fichier,"a+");
foreach($data as $k=>$v){
     fwrite($hand, $k."\t".$v);}
fclose($hand);
$i++;
if($i>=1000){$i=0;$j++;}

}



0
-helper- Messages postés 89 Date d'inscription   Statut Membre Dernière intervention   27
 
Si j'ai bien compris ta requete renvoie 90 000 lignes...
Si c'est le cas... On va ouvrir/fermer 90000 fois les fichiers.... c'est loin d'etre optimal comme algo...

Si c'est Mysql ton SGBD, il y a moyen de faire de la pagination avec le mot clef LIMIT...
0
-helper- Messages postés 89 Date d'inscription   Statut Membre Dernière intervention   27
 
Re,

Maintenant ca ressemble plus à un exercice d'algo... dans ce cas, on peut se passer du mot clef "LIMIT"...

Voici ce qui me semble être la proposition la plus lisible et plus performante (non testée, mais sur le principe tu trouveras à mon avis pas mieux...) :

// Init...
$sDirPath = dirname( __FILE__ );

// Tant qu'on a des enregistrements...
$rep = mysql_query( "SELECT field1, field2 FROM Matable ORDER BY field1 ASC" );
$iFiles = 0;
while( ($aRow = mysql_fetch_assoc($rep)) !== false ){
    
    // Ouvre un nouveau fichier
    $sFilePath = $sDirPath . DIRECTORY_SEPARATOR . 'mon_fichier' . $iFiles . 'txt';
    if( ($hF = fopen( $sFilePath, 'a+' )) !== false )
    {
        
        // Tant qu(on a des enregistrements en base et qu'on a pas dépassé le nombre autorisé par fichier...
        $iRows = 0;
        while( ($aRow = mysql_fetch_assoc($rep)) !== false && $iRows < 1000 )
        {
            fwrite( $hF, implode( '|', array_values( $aRow ) ) . PHP_EOL );
            $iRows++;
        }
        fclose( $hF );
        
    } else { throw new Exception( "Impossible d'écrire dans le fichier $sFilePath !" ); }

   $iFiles++;
    
}


Alors j'ai une bonne note !?

S@M
0
-helper- Messages postés 89 Date d'inscription   Statut Membre Dernière intervention   27
 
A noter que si c'est pas un exercice d'algo... je choisirais plus le format CSV que TXT pour enregistrer les données... Car apres tu peux ouvrir les fichiers avec un tableur style EXCEL, OpenOffice, ... Voir meme l'utiliser pour ré-injecter des données vers une autre base de données !
0