Numérotation de ligne

guy_1927 Messages postés 2 Statut Membre -  
heyquem Messages postés 808 Statut Membre -
Bonjour,
Je suis très novice en prog et voila mon problème :

Tableau 1 :

A1BG 2
A1BG 2
A1BG 2
A1BG 2
A1BG 2
A1BG 2
A1BG34 1
A1BG34 1
BG 1
BG 1
BG 1

Tableau 2 :

A1BG 2 6
A1BG 2 5
A1BG 2 4
A1BG 2 3
A1BG 2 2
A1BG 2 1
A1BG34 1 1
A1BG34 1 2
BG 1 1
BG 1 2
BG 1 3

j'ai un fichier avec 2 colonnes (tableau 1), la 1ère le nom et la 2ème colonne où il y a 1 ou 2. Pour un même nom c'est toujours le même chiffre qui est associé dans la colonne 2.
Et en fait pour le même nom dans la colonne 1 je veux numéroter de manière croissante quand il y a 1 et de manière décroissante dans la colonne 2 quand il y a un 2. Comme dans le tableau 2.
Pouvez-vous m'aidez ?

Merci d'avance

5 réponses

  1. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    Salut.
    En quel langage veux tu faire ça ?
    Le croissant est assez facile à faire, le décroissant impose de connaître à l'avance le nombre d'apparition, ce qui impose deux passe au moins.
    On peut faire ça en C++ assez facilement avec les map je pense.
    0
  2. guy_1927 Messages postés 2 Statut Membre
     
    Je n'ai pas de langage en particulier...

    Merci pour ta réponse.
    0
  3. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    J'écris rapidement (donc surement plein d'erreur) ce que ça donnerai en C++ :
    #include <fstream>
    #include <map>
    #include <string>
    int main()
    {
      std::fstream fs("tableau1.dat",std::ios::in);
      std::map<std::string,int> carte;
      std::string clef;
      int tmp;
      while(fs)
      {
         fs>>clef>>tmp;
         tmp=(tmp==1?-1:1);
         carte[fs]+=tmp;// selon le signe on saura si c'est croissant ou decroissant
       }
      for(std::map<std::string,int>::iterator it=carte.begin();it!=carte.end;it++)
      {
           cout<<it->first;
           if(it->second<0)cout<<" 1 "<<-(it->second);
           else cout<<" 2 "<<it->second--;
       }    
      return 0;
    }
    0
  4. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    avec awk, l'ordre des noms a été changé, est-ce important ?
    $ awk '{x[$1, $2]++ } END{for (n in x){split(n, a, SUBSEP); if(a[2]==2)for(l=x[n];l>0;)print a[1], l-- ; else for(l=1;l<=x[n];)print a[1], l++}}' tableau1 
    BG 1
    BG 2
    BG 3
    A1BG 6
    A1BG 5
    A1BG 4
    A1BG 3
    A1BG 2
    A1BG 1
    A1BG34 1
    A1BG34 2
    $ 
    
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. heyquem Messages postés 808 Statut Membre 131
     
    Voici un code en Python qui fonctionne en une seule passe, qui est sans erreur je pense et qui n'inverse pas les noms.
    De plus il est utilisable même pour un giga-fichier car le fichier est examiné ligne après ligne sans avoir à le charger en totalité dans la mémoire vive et le nouveau fichier écrit au fur et à mesure

    with open('depart.txt','r') as f, open('reecrit.txt','w') as g:  
        a,n = f.readline().split()  
        C = 1  
        while True:  
            try:  b,m = f.readline().split()  
            except:  b = None  
            C+=1  
            if b!=a:  
                gen = xrange(1,C) if n=='1' else xrange(C-1,0,-1)  
                g.writelines('{} {}\n'.format(a,i) for i in gen )  
                a,n,C = b,m,1  
            if b is None:  break
    0