Decouper un fichier texte en plusieurs fichiers texte

Soyez le premier à donner votre avis sur cette source.

Snippet vu 15 272 fois - Téléchargée 26 fois

Contenu du snippet

Découper un fichier texte ....en plusiers elements
plusieurs autres choix ...
nombre de lignes par fichier
noms des fichiers de desti " nomfichier000 - XXX
recopie la premiere ligne de la source dans chaque fichier ou non
et a chaque relance du prog .. renom le fichier 000 en nom de source et le 001 en 000 ext ....

une partie est un peut detaille .. mais le reste est en vrac ... ;-) .. mais peut etre utile .. pour les nuls comme moi .. ;-) il y a plein de fautes .. mais il marche bien .. (pour mon usage )
...

Source / Exemple :


#include <stdio.h>
#include <conio.h>
#include <io.h>
#include <string.h>
#include <stdlib.h>
#include <direct.h>
#include <ctype.h>
#define LISTE "list.big"
#define cleanner "\033[2J"

void creeliste (char [64], char[64]);
void copyfiles (void);
int comptligne(char [64]);

void main( void )
{
    FILE *streamD;
	FILE *stream;
	char line[100];
	char entete[100]={0};
	int loops;
	char Adress[64];
	char AdressD[64];
	char AdressDE[64];
	char AdressDD[64];
	char rep[64];
	int nblignes;
	int nbfiles=0;
	int nb_ligness=1;
	
	
printf ("by remybig@fr.st\n\n");

// recherche repertoire courant
 
	if( _getcwd( rep, 64 ) == NULL )
      perror( "erreur sur directory" );
   else
      
	//ajoute '\' a la fin du repertoir
	   strcat(rep,"\\");
   
printf ("\nRepertoir de travail. ");
printf( "\n%s\n", rep );

 if (access(LISTE,00)!=0 )

 {

	
	// saisie des parametres
	printf ("\nsaisir le nom du fichier a decouper   ex : nom.ext : ");
	scanf ("%s",&Adress);
	printf ("\nsaisir le nom du fichier de destination ex : nom sans ext : ");
	scanf ("%s",&AdressD);

	
	printf("\nChemin de la source :  %s  \n",Adress);
	getch();
	
	// cree chemin de dest et source

	
	printf("\nChemin de la dest :  %s---  \n",AdressD);
	getch();

	strcpy(AdressDE,AdressD);
 
 
			//compte le nombre de lignes dans le fichier

			nb_ligness = comptligne(Adress);

		// ouvre source
			if ((stream = fopen( Adress, "r" )) != NULL )
		 {
			do
			{
			
			printf("\n\nVotre fichier comporte %d lignes \n \n", nb_ligness);

			printf ("\nnb de lignes par fichier de dest maxi ...100 fichiers  : ");   
			scanf ("%d",&nblignes);

			if (nblignes ==0)
				nblignes= 1;   // si erreur de saisie 1 fichier minimum
			printf ("\n\t nombres de fichiers crees : %d",nb_ligness/nblignes);
			}while ((nb_ligness/nblignes)>100);

			fclose( stream );         // ferme la source pour la reouvrir
			} 
		else 
			printf ("\nerreur fichier inexistant. \a");  

	
		if ((stream = fopen( Adress, "r" )) != NULL )
			 {

				printf ("\n\nVoulez vous recopier la premiere ligne sur tous les fichiers . N/n  ");	
				printf( "\n%s\n",entete);
			if ( toupper(getch())!='N')
			{
				// copie entete fichier source
				fgets( entete, 100, stream );
					 
			}			 

				// met a jour fichier de liste
						 creeliste(LISTE,Adress);

					do
					{

					// cree le nom du fichier dest

						itoa(nbfiles,AdressDD,10);  
						strcpy(AdressD,AdressDE);
						strcat(AdressD,AdressDD); 
						nbfiles++;

					// cree et ouvre le fichier dest 
							if ((streamD = fopen( AdressD, "w" )) != NULL )
							{
							// incert l'entete	
								fputs( entete, streamD );

							// met a jour fichier de liste
							 creeliste(LISTE,AdressD);

							// copy les ..n ligne dans dest 
								for (loops=1;(loops <=nblignes);loops++)
								{
									if( feof( stream ))  // si fichie source fini .on quite la boucle 
										break; 

										 fgets( line, 100, stream );
										 printf( "%s",line);
										 fputs( line, streamD );
									 
												
								}
								fclose( streamD );  // ferme la   .. n source
							}
   
					}while ( !feof( stream ));   //control si source fini
				   fclose( stream );         // ferme la source

			    	strcpy(AdressD,Adress);
					strcat(AdressD,".old");				//renom la source 
					rename( Adress, AdressD );
					
			}

}
else 

copyfiles ();

	
}

//************************************************************************************

void creeliste(char path[64],char adrevari[64])
{
FILE *streamListe;
char buff[64]={0};

		 //ecrit le chemin complet de chaque fichier
	strcpy(buff,"\"");
	strcat(buff,adrevari);
	strcat(buff,"\"\n");

	 //  ecrit chaque ligne dans le fichier "list" 
    if ((streamListe = fopen( path, "a" )) != NULL ) 
	{	
		fputs( buff, streamListe );
		fputs( "\0", streamListe );
			
	}
	fclose( streamListe );

}
//********************************************************************************

int comptligne(char FileVari [64])
{
FILE *streamVari;
char C;
int BbLiGnE=1;

if ((streamVari = fopen( FileVari, "r" )) != NULL )
	{
			do 
			{
				 C=fgetc(streamVari);
				 if (C=='\n')
					BbLiGnE++;
     		}while (C!=EOF); // tant qu'on est pas a la fin du fichier
	
	fclose( streamVari );
	}
return (BbLiGnE);
}

//**************************************************************************************
void copyfiles (void)
{
FILE *streamlistE;
int NBlignes=0;
int AA;
int TRA;
char BUFline [64]={0}; 
char BuFFerx [105][64]={0};
char *stok;

		//compte les lignes . du moufard

	NBlignes = comptligne(LISTE);

		//stock les donnée
		
if ((streamlistE = fopen( LISTE, "r" )) != NULL )
	{	
	
	for (AA=0;AA<NBlignes-1;AA++)
		{ 
		fgets(BUFline,60, streamlistE );	//decoupe les noms par la recherche de "  	
		stok=strtok(BUFline,"\"");			
		strcpy(BuFFerx[AA],stok);
	   if(AA!=0)
			if (access(BuFFerx[AA],00)== 0)
				printf("%s\n",BuFFerx[AA]); 
			else								//visu si erreur
			printf("\n\tErreur_BUFFEREX  : %d \n",AA);
		}
	fclose( streamlistE );
	}
 

   printf ("\nrename\n");  

while (_access(BuFFerx[0],00)!=0)
{
	AA=1;
	remove( "liste.old");						//si source est toujours la ou pas
	if (strcmpi(BuFFerx[AA],"")==0)
	{
		remove(LISTE);
		printf ("\n \t Fin du fichier %s",BuFFerx[0]);//si file de remplacement fini
		break;
	}
	TRA=rename( LISTE, "liste.old" );
	
	for (;AA<=NBlignes-2;AA++)						//renom a la volee
	{
		printf ("rename  %s  en %s.\n",BuFFerx[AA],BuFFerx[(AA-1)]); 
		TRA=rename( BuFFerx[AA], BuFFerx[(AA-1)] );
		if (_access(BuFFerx[(AA-1)],00)!=-1)
		creeliste(LISTE,BuFFerx[(AA-1)]);
		if (TRA!= 0)
			{
			printf ("\nerreur rename fichier %s \n",BuFFerx[AA]);
			
			}
	}
};

getch();
} 

//*********************************************************************************

Conclusion :


bon a vous de le decouvrir ...
je l'ai fait tourner sous vc ++ et c'est ok ...
il est pas tres etudier au point de vu ressource memoir et acces fichier ..mais bon .. il marche et il peut aider quelqu'un .. de temps en temps ..
bye

A voir également

Ajouter un commentaire

Commentaires

Messages postés
2
Date d'inscription
mercredi 2 octobre 2002
Statut
Membre
Dernière intervention
22 février 2010

merci .. pour les infos ..
Messages postés
65
Date d'inscription
vendredi 14 février 2003
Statut
Membre
Dernière intervention
11 septembre 2004

j'ai survole la source et de ce que je peux en dire c'est que a mon avis tu te prend la tete pour compter le nbre de ligne (ya plus simple, mais je c pu comment ca marche) et ensuite, pour passer les mots d'un fichier a l'autre, tu te prend aussi la tete ...
dans le genre je ferais:
tant que c'est pas finit
lire mot fichier 1
mettre mot fichier 1 dans fichier 2
si nbre de mot par fichier atteint
mettre mot fichier 1 dans fichier 3
sinon
continuer
fin tant que
en gros ca donnerais ca ...
je te passe un de mes liens favoris pour ce qui est des fonctions du C pour le maniements de fichiers :http://www.lri.fr/~aze/page_c/aide_c/
vala
a+

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.