(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/>