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
A voir également:

5 réponses

Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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
guy_1927 Messages postés 2 Statut Membre
 
Je n'ai pas de langage en particulier...

Merci pour ta réponse.
0
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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
dubcek Messages postés 18788 Date d'inscription   Statut Contributeur Dernière intervention   5 643
 
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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