begin process at 2012 05 30 04:23:41
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Linux

 > 

Fichier & Disque

 > 

Suppression de caractères d'un gros fichier texte


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Suppression de caractères d'un gros fichier texte

mardi 21 septembre 2010 à 10:30:51 | Suppression de caractères d'un gros fichier texte

mslider

--Bonjour,

c'est juste pour une petite aide.
J'ai utilisé un code qui avait été mis au point à l'origine pour faire du cross-table(tableau croisé, voir le post http://www.cppfrance.com/forum.v2.aspx?ID=1399988) sur un gros fichier texte, je l'ai modifié pour un autre problème de nettoyage de fichier de séquences du type:

>sequence_1
GTTCAGAGTTCTACAGTCCGCCCCCNNGCCAAAAAA
>sequence_2
TCGTATGCCGTCTTCTGCTTGAATCGTATGCCGTCT
>sequence_3
AAAAAAATGCCGTCTTCGTATGCCGTCTTCTGCTTG
>sequence_4
AAAAAAGAATGTNAGCTAATGTCGNTTGCTTTTTTT
>sequence_5
CATCGTATGCCGTNTTCTGCTCGTATGCCGACTTCT
>sequence_6
NNNGTATGNNGTCTTCTGCTTGGCCGTCTTCTGCTT

le format de ce fichier est une succession d'entêtes du type ">sequence_n" suivi de sa séquence.

Je veux en fait nettoyer que les séquences et ne pas toucher aux entêtes.
Je veux que les séquences après nettoyage ne contiennent uniquement que les caractères A,T,G,C (les minuscules sont aussi autorisées mais dans ce cas il convient de les convertir en majuscules).

Dans le code que j'ai testé je me suis attaché à supprimer uniquement les "N",
le code en question compile bien mais à l'exécution le fichier de sortie est vide, et je vois pas le bug.

Aussi je sollicite votre aide, merci à vous tous.

voici le code:

Code C/C++ :

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_STRING 1024

void delete_char(char *src, char c, int len);

typedef struct {
   char **array;
   int size;
   int allocSize;
   } ARR;


void sortie(char *msg, int nret)
{
   fprintf(stderr, msg);
   exit(nret);
}

void initArray(ARR* a, int sz)
{
   a->size = 0;
   a->allocSize = sz;
   a->array = (char **) malloc(sizeof(char *) * sz);
   }

long findOrAddArray(ARR *arr, char *item)
{

   long i = arr->size;
   int n = strlen(item);
   char * key = malloc(n + 1 + sizeof(long));
   strcpy(key, item);

   if ( arr->size == arr->allocSize ) {
       arr->allocSize *= 2;
       char ** p  = (char **) malloc(sizeof(char *) * arr->allocSize);
       memcpy(p, arr->array, sizeof(char *) * arr->size);
       free(arr->array);
       arr->array = p;
   }
   arr->array[i] = key;
   arr->size++;
   return i;
}



void outBuf(int fd, char **s, int n)
{
   char *buf = malloc(n*15);
   char *p = buf;
           while ( n-- > 0 )
       {
       char *t = *s++;
       *p++ = *t++;

       char *h = strchr(p, '>');
        if(h != NULL)
        {
         write(fd, p, n);
                   }
      else{
      delete_char(p, 'N', 0);
      write(fd, p, n);
            }
       }
   free(buf);
}


int main(int argc, char* argv[])
{
       char buf1[MAX_STRING];

       if (argc <= 1)
       sortie("Input file missed !\n", 1);

       char *inFile = argv[1];
       char *outFile = NULL;

       if ( argc > 1 )
       outFile = argv[2];

       ARR gsm;
       initArray(&gsm, 2000);

       long i;
       int fd;

   if ((fd = open(inFile,O_RDONLY))<1){
       sortie("Cant open file \n", 1);
   }

       if(inFile == NULL) {
       sortie("File is empty \n", 1);
               }

   struct stat st;
   stat(inFile, &st);
   unsigned long fsz = st.st_size;

   if ( fsz == 0 ){
       sortie("File is empty \n", 1);
       }

   else{fprintf(stderr, "size = %d\n", fsz);
          }

   char *bufFile = malloc(st.st_size);
   if ( !bufFile )
       sortie("Erreur malloc bufFile\n", 2);


       /************************ Lecture ***************************/

   time_t t0, t1, t2, t3;
   int nr;
   char *pbf, *p;
   int n = 1;
   long nl = 0;
   long ncur = 0;
   double cx = 100.0/fsz;

   time(&t0);

   for (pbf = bufFile; (nr=read(fd, pbf, 4096)) > 0; pbf += nr )
   {
       for (p=pbf; p<pbf+nr; p++)
       {
           if ( *p == '\r' )
               *p = ' ';
           else if ( *p == '\n' )
               nl++, *p = 0;
       }
       ncur += nr;
       if (cx*ncur > n )
       {
           fprintf(stderr, "\rRead %d%%", n);
           fflush(stderr);
           n = 1 + cx*ncur;
       }
   }
   *pbf = 0;
   if ( pbf>bufFile && pbf[-1] )
       nl++;
   close(fd);

   time(&t1);
           fprintf(stderr, "\rRead 100%%, NL=%d  %ds\n", nl, t1-t0);

   if ( nl == 0 )
       sortie("File empty\n", 4);


/************************ Traitement ***************************/
   char **row = (char **)malloc(nl*sizeof(char *));
   if ( !row )
       sortie("Erreur malloc row\n", 2);

   long *vgsm = (long *)malloc(nl*sizeof(long));
   if ( !vgsm )
       sortie("Erreur malloc vgsm\n", 2);

   char **prow = row;
   long *pvgsm = vgsm;

   pbf = bufFile;

  while ( *pbf )
   {
       *pvgsm = 0;
       *prow = NULL;
        i = strlen(pbf)+1;

       if ( p = strtok(pbf, "") ) {
           *pvgsm = findOrAddArray(&gsm, p);
           if ( (p=strtok(NULL, "")) && strtok(NULL, "") )
               *prow = p; // pointe sur tag
       }
       prow++;
       pvgsm++;
       pbf += i;
   }
   if ( gsm.size == 0 )
       sortie("No input lines\n", 3);

   time(&t2);
   fprintf(stderr, "\nTreatment 100%%, %ds\n", t2-t1);

   /************************ Ecriture ***************************/

   size_t szRes = gsm.size * sizeof(long);
   char **res = (char **)malloc(szRes);
   if ( !res )
       sortie("Erreur malloc res\n", 2);
   char **res0 = (char **)malloc(szRes);
   if ( !res0 )
       sortie("Erreur malloc res0\n", 2);
   char zero[] = "0";
   for (i=0; i<gsm.size; i++)
       res0[i] = zero;
   memcpy(res, res0, szRes);

       int fdo = 1;
       if ( outFile ){
               fdo = open(outFile, O_WRONLY|O_CREAT|O_TRUNC,0755);
       }

   if ( fdo < 0 )
   {
       fprintf(stderr, "%s: Fail to open outfile, use of stdout\n", outFile);
       fdo = 1;
   }

   outBuf(fdo,gsm.array, gsm.size);

   time(&t3);
           fprintf(stderr, "\rEcriture 100%%, %ds\n", t3-t2);

   /************************ Terminé**************************/
           fprintf(stderr, "Temp total: %d'%02d\n", (t3-t0)/60, (t3-t0)%60);

       free(gsm.array);
   free(res);
   free(res0);
   free(bufFile);
   exit(0);

}

void delete_char(char *src, char c, int len)
{
       char *dst;
       int i;

       // Do not remove NULL characters.
       if ( c == 0 )
               return;

       // Small attempt to control a buffer overflow if the
       // the string is not null-terminated and a proper length
       // is not specified.
       if ( len <= 0 )
               len = MAX_STRING;

       dst = src;

       for ( i = 0; i < len && *src != 0; i++, src++ )
       {
               if ( *src != c )
                       *dst++ = *src;
       }

       // Ensure the string is null-terminated.
       *dst = 0;

       return;
}




Cette discussion est classée dans : int, char, arr, malloc, if


Répondre à ce message

Sujets en rapport avec ce message

erreur bizzare [ par lektrosonic ] Bonjour, je code un programe en C sous Visual Studio.La chose qui est tres surprenante c est que quand je lance mon programe a partir de windows, il p analyseur lexical pascal [ par perrotta ] Bonjour, dsl pour ma langue je parle pas bien le français; je suis entrin de devlopper un analyseur lexical pour un programme (pascal) prèci ,et j'ai Gestion de plusieurs ports RS232 [ par dissezfr ] Bonjour à tous d'abordJ'ai récupéré un code sur le site permettant de géré un port série, j'aimerai piloter 8 (voir +) ports série avec un seul ordina AIDE [ par alex64100 ] BOJOUR je dois coder un correcteUr d'orthographe mon code est truffé d'erreurs, j'ai du mal à les corriger svp aidez-moi #include #include #inclu BLITZ++ [ par ciaonataha ] Salut a tous!!!J'ai besoin d'aide..Qn travaillent avec biblioteque BLITZ++....Je veux recrier ça:for (int t=0; t {  for (int p=0; p     if (T==Tr(t char* dans un destructeur [ par pepsidrinker ] Premierement, merci de lire ce post, et merci a tous ceux qui veulent maider. Jai le probleme suivant: Jassigne des char* avec 'new[]' dans le constru Programme permetant de faire un calcul simple. [ par marthymbiz ] Salut tout le monde,J'ai créé un programme en C qui permet de faire un calcul simple.Pour se faire, l'utilisateur doit saisir une chaine de caractères qu'en pensez vous?? besoin d'aide!! lol [ par nelly77 ] bonjour je voudrai créer un tableau avec une liste de produits ayant des attributs comme  leur nom, leur etat dans un stock, la duree de fabrication e Erreur C4430 (besoin d'aide) [ par lui88 ] Bonjour , une erreur est apparu dans mon code error c4430:spécificateur de type manquant - int est pris en compte par défaut.remarque: C++ ne prend pa Passer un tableau de char en paramètre [ par DeadStar117 ] Bonjour,Je cherche à passer des tableaux de char en paramètre à mes procédure mais je n'y arrive pas.Voila un exemple de code:GestionArbre GeAr;<font


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,154 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales