Extraction donnée TXT

Extraction donnée TXT - Divers - Programmation

Marsh Posté le 30-11-2018 à 15:21:51    

Bonjour,
 
Je suis en possession d'un GROS fichier TXT (+ de 5000 lignes) où je dois extraire les 12 premiers caractères de chaque ligne pour pouvoir les compter.
 
Voici un petit exemple du fichier :
04ZZZZF00524871044738435000076
04ZZZZF00624871075511444100012
04ZZZZF00722732254090864000080
04RAA5200002733093314054600008
04RAA5200002733093324360500004
04RAA5200002733093324361200001
04RAA5200002733093324363600004
04RAA5200002800109060940300002
04RAA5200002800109060959500002
 
 
Voici ce que je je voudrais en termes de réponse :
04ZZZZF00524 = 1
04ZZZZF00624 = 1
04ZZZZF00722 = 1
04RAA5200002 = 6
 
Je me tourne vers vous pour savoir quelle méthode utiliser.
 
 

Reply

Marsh Posté le 30-11-2018 à 15:21:51   

Reply

Marsh Posté le 30-11-2018 à 16:15:03    

Ca dépend de pas mal de choses : ton niveau en dév, les outils à ta disposition, qui peuvent d'ailleurs dépendre de l'OS de la machine où tu fais le traitement.
Sous Linux, t'as Awk.
 
Après, en Perl, PHP ou Python, tu peux facilement faire un script qui lit ton fichier, extrait les 12 premiers caractères et utilise cette chaîne comme clé dans un tableau associatif, clé à laquelle tu associes un compteur. Si la clé n'existe pas dans le tableau, tu l'ajoutes et tu initialise le compteur à 1 ; si elle existe déjà tu fais +1 sur le compteur.
 
A la fin, tu fais une boucle sur le tableau : tu affiches chaque clé avec son compteur. Script qui se fait en 5 min quand on a l'habitude.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 30-11-2018 à 16:20:26    

Pareil que Rufo : ca vas être dur de t'aider sans connaitre ton niveau et les outils à disposition !
 
Ça doit même pouvoir se faire avec un tableur type Calc ou Excel...
 
...par contre je suis nul en tableur je pourrais pas aider, mais ça me semble jouable sans passer par du code ! ^^


---------------
D3
Reply

Marsh Posté le 30-11-2018 à 16:51:46    

Oui, via Excel c'est possible mais avec les macros en VBA. Je vois pas trop comment faire avec des formules :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 30-11-2018 à 20:35:49    

Colonne 1 : les données
(trier les données de la colonne 1 par ordre croissant ou décroissant)
Colonne 2 : =GAUCHE(cellule colonne 1;12)
Colonne 3 : =NB.SI(colonne 2;cellule colonne 2)
Colonne 4 : =EQUIV(cellule colonne 2;colonne 2;0)
Colonne 5 : =SI(LIGNE(cellule colonne 5)=cellule colonne 4;cellule colonne 2;"" )
Colonne 6 : =SI(LIGNE(cellule colonne 5)=cellule colonne 4;cellule colonne 3;"" )

 

Les résultats sont dans la colonne 5 et 6.

Message cité 1 fois
Message édité par MaybeEijOrNot le 30-11-2018 à 20:37:04

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 30-11-2018 à 22:10:12    

Effectivement le passage par excel avec les macro en VBA me semble la solution la plus simple pour moi car je ne suis pas trop caller en terme de programmation.
 
Ensuite, je suis en train de me mettre sur linux donc je garde Awk en tête.
 
Pour ce qui est des autres langages cités, je les garderais en tête à l'avenir ;)
 
Je suis plus orienté réseau, mais il me faut des bases pour la programmation.
 
Un grand merci à tous pour vos réponses !


---------------
C'est pas faux
Reply

Marsh Posté le 30-11-2018 à 22:23:06    

La solution que je propose est sur Excel et sans Macro, juste à voir si Excel tire la tronche avec le tri de données s'il y en a vraiment beaucoup. Mais dans tous les cas, le calcul des doublons est de plus en plus lourd avec l'augmentation de la quantité de données.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 30-11-2018 à 22:31:43    

Jusqu'à 15000 à 20000 lignes, ça doit passer je pense.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 01-12-2018 à 00:11:55    

rufo a écrit :

Ca dépend de pas mal de choses : ton niveau en dév, les outils à ta disposition, qui peuvent d'ailleurs dépendre de l'OS de la machine où tu fais le traitement.
Sous Linux, t'as Awk.
 
Après, en Perl, PHP ou Python, tu peux facilement faire un script qui lit ton fichier, extrait les 12 premiers caractères et utilise cette chaîne comme clé dans un tableau associatif, clé à laquelle tu associes un compteur. Si la clé n'existe pas dans le tableau, tu l'ajoutes et tu initialise le compteur à 1 ; si elle existe déjà tu fais +1 sur le compteur.
 
A la fin, tu fais une boucle sur le tableau : tu affiches chaque clé avec son compteur. Script qui se fait en 5 min quand on a l'habitude.

Yep!
en perl:

Code :
  1. my %h;
  2. open my $fh, "<", "fichier-de-data.txt";
  3. $h{substr($_, 0, 12)}++ while (<$fh> );
  4. print "$_ = $h{$_}\n" foreach (keys %h);
  5. close $fh;


et pour une variante un peu plus robuste et à la sortie triée

Code :
  1. use autodie;
  2. my %h;
  3. open my $fh, "<", 'fichier-de-data.txt';
  4. while (<$fh> ) {
  5.     $h{substr($_, 0, 12)}++ if (/^[0-9A-Z]{12}/);
  6. }
  7. print "$_ = $h{$_}\n" foreach (sort keys %h);
  8. close $fh;


A+,


Message édité par gilou le 01-12-2018 à 10:07:49

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 01-12-2018 à 12:43:57    

MaybeEijOrNot a écrit :

Colonne 1 : les données
(trier les données de la colonne 1 par ordre croissant ou décroissant)
Colonne 2 : =GAUCHE(cellule colonne 1;12)
Colonne 3 : =NB.SI(colonne 2;cellule colonne 2)
Colonne 4 : =EQUIV(cellule colonne 2;colonne 2;0)
Colonne 5 : =SI(LIGNE(cellule colonne 5)=cellule colonne 4;cellule colonne 2;"" )
Colonne 6 : =SI(LIGNE(cellule colonne 5)=cellule colonne 4;cellule colonne 3;"" )

 

Les résultats sont dans la colonne 5 et 6.

 

Oups, pas besoin de tri, j'ai ajouté ça après en me disant que ça permettait d'éliminer les trous dans les colonnes de résultats, mais non. Ma solution est bonne mais les colonnes de résultats possèdent des trous (avec ou sans tri), à voir si une solution existe pour récupérer tous les résultats en haut des colonnes.

 

EDIT : il y a la possibilité de filtrer (les cellules non vides) les deux colonnes de résultats mais ça reste un filtre, c'est-à-dire que les références des cellules restent les mêmes, simplement des lignes sont cachées.


Message édité par MaybeEijOrNot le 01-12-2018 à 12:45:39

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 01-12-2018 à 12:43:57   

Reply

Marsh Posté le 01-12-2018 à 14:01:00    

Possible en 100% Excel, 0% VBA :
 
https://reho.st/self/17627eaaf34bc2473ce106a7fb1d9309c578aad4.jpg
 
 
Me demander si c'est la solution choisie.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed