Numérotation de ligne
guy_1927
Messages postés
2
Statut
Membre
-
heyquem Messages postés 808 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
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
-
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. -
Je n'ai pas de langage en particulier...
Merci pour ta réponse. -
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; } -
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 $ -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
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