Extraire des données mysql vers des fichiers texte

Fermé
dgdev - 21 mai 2014 à 09:29
-helper- Messages postés 89 Date d'inscription mercredi 21 mai 2014 Statut Membre Dernière intervention 15 juin 2014 - 25 mai 2014 à 15:18
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 mercredi 20 mars 2013 Statut Membre Dernière intervention 1 juin 2015 14
25 mai 2014 à 14:30
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 mercredi 21 mai 2014 Statut Membre Dernière intervention 15 juin 2014 27
Modifié par -helper- le 25/05/2014 à 15:42
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 mercredi 21 mai 2014 Statut Membre Dernière intervention 15 juin 2014 27
Modifié par -helper- le 25/05/2014 à 15:22
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 mercredi 21 mai 2014 Statut Membre Dernière intervention 15 juin 2014 27
Modifié par -helper- le 25/05/2014 à 15:43
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