(Courriels de diversion: <mercuriales@flippers-deroute.com> <relayer@degazant-repus.com> <calibrent@grossissent-irrite.com> <urgences@grâce-favoriserait.com> <debarquerent@colmatera-entr'aperceviez.com> <encastrera@libres-sillonnaient.com> <cauteriseriez@repererait-spoliateur.com> <appele@depaqueter-gendarme.com> <assermenter@sportivement-alcools.com> <rebâtiras@chequier-arrimez.com> )
Marc Bianciotto wrote: > > Je cite J-F Bardou, le Wed, Mar 28, 2001 at 02:56:33PM +0200 : > -) "Jean-François THAMIE" wrote: > -) > > -) > Salut à tous, > -) > j'ai un fichier contenant des enregistrements de longueur 4000 > -) > je voudrais générer un autre fichier où chaque ligne de 4000 serait remplacée > -) > par le découpage de cette ligne en enregs de 250, soit 16 enregs de longueur 250 > -) > J'ai une soluce avec des boucles mais question perf, c'est pas ca > -) > Je pensait a d'autres commandes comme pr mais je ne vois pas > -) > Si au passage quelqu'un a une idée > -) > Merci > -) > > -) > -) > -) Je me suis fabriqué -pour le meme probleme- un petit programme : > -) coupfile qui devrait faire ce que tu veux : > -) > -) /* ======= coupfile.c : decoupe un fichier de caractères ======== */ > -) /* */ > -) /* découpe un flot de données (sans fin d'enregistrement) */ > -) /* en enregistrements de longueur fixe (suivant paramètre fourni) */ > -) /* */ > -) /* entrée et sortie standard */ > -) /* on ajoute un separateur=0a en fin d'enregistrement */ > -) /* si un séparateur est en place, on n'ajoute rien */ > -) /* si un séparateur n'est pas en place il est effacé */ > -) /* si lg demandée n'est pas un multiple de la lg du fichier, */ > -) /* le dernier enreg est incomplet */ > -) > Bonjour, > > Quelle est la licence de programme? Heu, je veux dire, est-ce que tu > veux bien diffuser le code source au lieu de l'exécutable? > (Personnellement, ça m'interresserait surtout pour une usage > "pédagogique", je ne suis pas un dieu du C, et lire du code est > parait-il ce qu'il y a de mieux à faire pour le devenir... ; ) Licence GPL; tous droits réservés :-) Ne me fais pas rire : je ne connais rien en C . Alors, pour ce qui est de la pédagogie... à part peut-etre pour voir ce qu'il ne faut pas faire !? > > Bonne journée, > > Marco -- Cordialement, J-F Bardou
/home/polycr/DEVEL/Divers/COUPFILE/coupfile6.txt
------------------------------------------------
/* ======= coupfile.c : decoupe un fichier de caractères ======== */
/* */
/* découpe un flot de données (sans fin d'enregistrement) */
/* en enregistrements de longueur fixe (suivant paramètre fourni) */
/* */
/* entrée et sortie standard */
/* on ajoute un separateur=0a en fin d'enregistrement */
/* si un séparateur est en place, on n'ajoute rien */
/* si un séparateur n'est pas en place il est effacé */
/* si lg demandée n'est pas un multiple de la lg du fichier, */
/* le dernier enreg est incomplet */
/* EXEMPLES : */
/* 1- decoupage du fichier ficinp suivant la lg xxx dans ficout */
/* coupfile6 -l xxx <ficinp >ficout */
/* 2- idem + remplacement de car 0 par car "-" */
/* coupfile6 -l 10 <finp | sed -e 's/0/-/g' >fout.2 */
/* */
/* 3- saisie clavier de car : obtenir des enreg de lg fixe */
/* ATTENTION: fin saisie = CTRL-D */
/* coupfile6 -l 10 >fout */
/* */
/* obtenir les lignes entrées au clavier numérotées */
/* coupfile6 -l 10 | awk '{print ("ligne " NR " = " $0)}' >fout.2 */
/* */
/* ============================================================== */
J-F BARDOU - copyright et GPL
/* ======= coupfile.c : decoupe un fichier de caractères ======== */
/* */
/* découpe un flot de données (sans fin d'enregistrement) */
/* en enregistrements de longueur fixe (suivant paramètre fourni) */
/* */
/* entrée et sortie standard */
/* on ajoute un separateur=0a en fin d'enregistrement */
/* si un séparateur est en place, on n'ajoute rien */
/* si un séparateur n'est pas en place il est effacé */
/* si lg demandée n'est pas un multiple de la lg du fichier, */
/* le dernier enreg est incomplet */
/* */
/* EXEMPLES : */
/* 1- decoupage du fichier ficinp suivant la lg xxx dans ficout */
/* coupfile6 -l xxx <ficinp >ficout */
/* */
/* 2- idem + remplacement de car 0 par car "-" */
/* coupfile6 -l 10 <finp | sed -e 's/0/-/g' >fout.2 */
/* */
/* 3- saisie clavier de car : obtenir des enreg de lg fixe */
/* ATTENTION: fin saisie = CTRL-D */
/* coupfile6 -l 10 >fout */
/* */
/* obtenir les lignes entrées au clavier numérotées */
/* coupfile6 -l 10 | awk '{print ("ligne " NR " = " $0)}' >fout.2 */
/* */
/* ============================================================== */
#include <stdio.h>
int main(argc, argv)
int argc;
char *argv[];
{
char ficinp [255];
char ficout [255];
int i = 0;
int imax = 0;
int j = 0;
int jmax = 0;
char c;
char mano[255];
char *pmano;
int lg_fixee = 0;
int lg_cour = 0; /* longueur courante */
int enreg_incomplet=0;
unsigned long nb_car_inp;
unsigned long nb_car_out;
unsigned long nb_car_sep; /* nbre de séparateurs ajoutés *
/* version 2 : coupfile -l xxx <ficinp >ficout */
if (argc != 3) /* erreur nbr arguments*/
{
fprintf (stderr,"coupfile : err1, usage : coupfile -l xxxxx <ficinp >ficout\n");
return (1);
}
/* imprime les arguments de la ligne de commande */
imax = argc ;
/* for ( i=1 ; i<imax ; i++) {
fprintf (stderr,"coupfile.c 1:arg[%d]=%s\n",i , argv[i]);
}
*/
/* TEST : découpe la ligne de commande*/
/* for ( j=1 ; j < argc ; j++){
fprintf (stderr,"coupfile.c decoupage de:argv[%d]=%s \n",j , argv[j]);
for (i=0; argv[j][i] != '\0' ; i++){
fprintf (stderr,"%c ", argv[j][i]);
}
fprintf (stderr,"\n");
}
*/
/* examine les arguments */
/**/
/* 2ème argument : "-l" */
if (strcmp (argv[1], "-l") != 0) {
fprintf (stderr,"coupfile : err2, 2ème argument=%s, doit etre -l\n", argv[1]);
return (1);
}
/* 3ème argument : longueur du découpage */
for (i=0; argv[2][i] != '\0' ; i++){
c=argv[2][i];
/*fprintf (stderr,"c=%c ascii=%i\n",c,c);*/
if ((c < '0') || (c > '9')){
fprintf (stderr,"coupfile : err3, 3ème argument=%s, non numérique\n", argv[2]);
return (1);
}
}
/* la longueur est ok, on stocke */
lg_fixee= atoi(argv[2]);
/* 4 ème argument : fichier input */
/* entree standard, non contrôlée */
/* 5ème argument : ficheir output */
/* sortie standard, non contrôlée */
/* lire et ecrire car/car */
nb_car_inp = nb_car_out = nb_car_sep = 0;
lg_cour = 0;
while (read(0, &c, 1) == 1) {
nb_car_inp++ ;
if (c!=0x0A) { /*si car # 0a écrit en sortie*/
/*si on tombe sur un 0a en place, pas d'action*/
write(1, &c, 1);
nb_car_out++ ;
lg_cour++ ;
}
if (lg_cour == lg_fixee){ /* lg fixée atteinte, on ajoute un 0a*/
c=0x0A; /* on ajoute un séparateur = fin de ligne */
write(1, &c, 1);
nb_car_sep++ ;
nb_car_out++ ;
lg_cour = 0;
}
}
/* fin de fichier */
/* il peut y avoir un enreg incomplet :terminé par 0a */
if (lg_cour != 0) {
c=0x0A;
write(1, &c, 1);
nb_car_sep++ ;
nb_car_out++ ;
enreg_incomplet=1;
}
/* fin de programme */
fprintf (stderr,"coupfile :");
for ( i=0 ; i<imax ; i++) {
fprintf (stderr," %s ", argv[i]);
}
fprintf (stderr,"\n");
fprintf (stderr,"coupfile : nb car lus = %d\n", nb_car_inp);
fprintf (stderr,"coupfile : nb car écrits = %d\n", nb_car_out);
fprintf (stderr,"coupfile : nb séparateurs = %d\n", nb_car_sep);
if (enreg_incomplet == 1) {
fprintf (stderr,"coupfile : ATTENTION: dernier enregistrement INCOMPLET\n");}
return (0);
}
--------------------------------------------------------------------- Aide sur la liste: <URL:mailto:linux-31-help@savage.iut-blagnac.fr>Le CULTe sur le web: <URL:http://www.CULTe.org/>