OVH Cloud OVH Cloud

Mysql export ascii

7 réponses
Avatar
billard.eric
Bonjour,
Désolé de poser une question dont le sujet est MySql, mais je n'ai pas
trouvé de groupe adéquat... et je veux faire ça en PHP.

je dois exporter une table ayant la structure suivante (par exemple) :
id int(5),
nom char(20),
prenom char(15),
code char(3)
vers un fichier au format ASCII non délimité, ayant la meme structure
que la table.
Résultat attendu :
00041NOM PRENOM A15[Retour chariot, ligne
suivante]
< 5 ><--------20-------><-------15----><3>
Le résultat doit être lu par un programme COBOL sur un Mainframe.
Sexy, non ?
Quelle requete envoyer au serveur pour obtenir ce résultat ?
Merci pour votre aide...

7 réponses

Avatar
CrazyCat
Eric BILLARD wrote:
id int(5),
nom char(20),
prenom char(15),
code char(3)
vers un fichier au format ASCII non délimité, ayant la meme structure
que la table.
Résultat attendu :
00041NOM PRENOM A15[Retour chariot, ligne
suivante]
< 5 ><--------20-------><-------15----><3>


$sql_export = "SELECT * FROM table";
$req_export = mysql_query($sql_export);
while (list($id,$nom,$prenom,$code) = mysql_fetch_row($req_export)) {
$d_id = 5 - strlen($id);
for ($i=0;$i<$d_id;$i++) { $id = "0".$id; }
$d_nom = 20 - strlen($nom);
for ($i=0;$i<$d_nom;$i++) { $nom .= " "; }
$d_prenom = 15 - strlen($prenom);
for ($i=0;$i<$d_prenom;$i++) { $prenom .= " "; }
$ascii .= $id.$nom.$prenom."n";
}

Code simpliste mais qui permet de bien voir le fonctionnement de la
chose, je n'ai pas cherché à savoir s'il y avait mieux :)

--
Tout sur les eggdrops
http://www.c-p-f.org
ML @

Avatar
Stephane Pineau
Le 28 Sep 2004 15:01:28 GMT, CrazyCat écrivait:

$d_id = 5 - strlen($id);
for ($i=0;$i<$d_id;$i++) { $id = "0".$id; }
$d_nom = 20 - strlen($nom);
for ($i=0;$i<$d_nom;$i++) { $nom .= " "; }
$d_prenom = 15 - strlen($prenom);
for ($i=0;$i<$d_prenom;$i++) { $prenom .= " "; }
$ascii .= $id.$nom.$prenom."n";
Code simpliste mais qui permet de bien voir le fonctionnement de la
chose, je n'ai pas cherché à savoir s'il y avait mieux :)


Ben en tout cas c'est l'occasion de faire découvrir ou redécouvrir une
fonction native toute bête : str_pad. Ton bout de code devient :

$d_id=str_pad($d_id,5,"0",STR_PAD_LEFT);
$d_nom=str_pad($d_nom,20); // padding par défaut à droite avec des espaces
etc;...

La fonction permet de faire du padding avec un caractère ou avec une suite
de caractères, à gauche, à droite, ou des deux côtés à la fois....

Voilà y a plein de petites perles comme ca dans la liste des fonctions
"chaines de caractères", une section à relire régulièrement:-)

Cdlt,
Stéph'

--
AcroDict : Dictionnaire francophone des acronymes informatiques
<URL:http://www.teaser.fr/~spineau/acrodict/>
PHP Page : Script PHP3 Gratuits (Forum, Gestionnaires BDD, etc..)
<URL:http://steph.pineau.free.fr/php/index.php>

Avatar
Benoit F
$sql_export = "SELECT * FROM table";
$req_export = mysql_query($sql_export);
while (list($id,$nom,$prenom,$code) = mysql_fetch_row($req_export)) {
$ascii.=str_pad($id,5,'0',STR_PAD_RIGHT);

$ascii.=str_pad($nom,20);
$ascii.=str_pad($prenom,15);
$ascii.=strpad($code,3);
$ascii.="n";

}
... je n'ai pas cherché à savoir s'il y avait mieux :)


Un peu plus court, et donc simple et moins sujet à erreur.

--
Benoit F.

Avatar
Paul Delannoy
CrazyCat a écrit:
Eric BILLARD wrote:

id int(5), nom char(20), prenom char(15), code char(3)
vers un fichier au format ASCII non délimité, ayant la meme structure
que la table.
Résultat attendu :
00041NOM PRENOM A15[Retour chariot, ligne
suivante]
< 5 ><--------20-------><-------15----><3>



$sql_export = "SELECT * FROM table";
$req_export = mysql_query($sql_export);
while (list($id,$nom,$prenom,$code) = mysql_fetch_row($req_export)) {
$d_id = 5 - strlen($id);
for ($i=0;$i<$d_id;$i++) { $id = "0".$id; }
$d_nom = 20 - strlen($nom);
for ($i=0;$i<$d_nom;$i++) { $nom .= " "; }
$d_prenom = 15 - strlen($prenom);
for ($i=0;$i<$d_prenom;$i++) { $prenom .= " "; }
$ascii .= $id.$nom.$prenom."n";
}

Code simpliste mais qui permet de bien voir le fonctionnement de la
chose, je n'ai pas cherché à savoir s'il y avait mieux :)
Ben c'est pas mal du tou, à mes yeux. Juste vérifier qu'il n'y a pas un

car bidon devant les nbs, ou des coquineries du genre...


Avatar
CrazyCat
Stephane Pineau wrote:
Le 28 Sep 2004 15:01:28 GMT, CrazyCat écrivait:
[snip de mes bétises pas si stupides]


Ben en tout cas c'est l'occasion de faire découvrir ou redécouvrir une
fonction native toute bête : str_pad. Ton bout de code devient :
$d_id=str_pad($d_id,5,"0",STR_PAD_LEFT);
$d_nom=str_pad($d_nom,20); // padding par défaut à droite avec des espaces
etc;...
[Snip des explications que je garde au chaud]


Merci bien Stéphane et Benoit, comme quoi il y a des fois des RTFM qui
se perdent.
En fait, je travaille (professionnellement) en ASP et j'ai toujours du
mal à me souvenir que PHP est bien mieux équipé en fonctions natives.

En v'la encore un qui se couchera moins idiot :)

--
Tout sur les eggdrops
http://www.c-p-f.org
ML @

Avatar
CrazyCat
Solution alternative trouvée sur google (en anglais):

Exporting data from MySQL for the most part is very easy, but doing so
in fixed width requires alittle more work. This will show you a basic
example of how to export data from MySQL into fixed-width format.

Basically you want to select all the field names, and length's of those
fields. To cheat I usually look at the table creation statement and use
the maxlength for the pad values. Here is the basic example:

SELECT
rpad(fname, 25, ' '),
rpad(lname, 30, ' '),
rpad(address1, 50, ' '),
rpad(address2, 50, ' '),
rpad(city, 35, ' '),
rpad(state, 35, ' '),
rpad(zip, 20, ' '),
rpad(phone1, 20, ' '),
rpad(phone2, 20, ' '),
rpad(fax1, 20, ' '),
rpad(email, 100, ' '),
FROM tablename
into outfile '/tmp/filename.txt'
fields terminated by ''
lines terminated by 'n';

Basically all your doing is using the rpad function to add spaces (the
third value) to fill up the blank space and make it into fixed width.
Beyond that the "into outfile" is where you want the data to be save,
and remember this is on the server your connection to, not the client.

--
Tout sur les eggdrops
http://www.c-p-f.org
ML @
Avatar
billard.eric
Eh bien, déjà : je vous remercie de m'avoir répondu. Et je cours
essayer tout ça ! Comme je poste depuis Google, la réponse .... pas
tout de suite.
Merci encore
EB