(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);		
}

coupfile6

---------------------------------------------------------------------
Aide sur la liste: <URL:mailto:linux-31-help@savage.iut-blagnac.fr>Le CULTe sur le web: <URL:http://www.CULTe.org/>