Decouper un fichier

Decouper un fichier - Shell/Batch - Programmation

Marsh Posté le 23-04-2015 à 17:55:00    

Bonjour,
 
j'ai un fichier qui se présente de la sorte
 

Citation :

Entreprise;Adresse;Code_E;Commande;Qte;Commande;Qte;Commande;Qte;Commande;Qte
ABB;Paris;12;RV34;4;RSP;19;RV56;8;PEL;5
Auchan;Nice;06;RV34;89;RSP;12;RV56;2;PEL;90


 
 
Je voudrais avoir 2 fichiers en sortie qui contiennent uniquement les commandes RV34 et RV56.
Le 1er fichier  

Citation :

Entreprise;Adresse;Code_E;Commande;Qte;Commande;Qte
ABB;Paris;12;RV34;4;RV56;8
Auchan;Nice;06;RV34;89;RV56;2


 
Le 2ème Fichier

Citation :

Entreprise;Adresse;Code_E;Commande;Qte
ABB;Paris;12;RV34;4
ABB;Paris;12;RV56;8
Auchan;Nice;06;RV34;89
Auchan;Nice;06;RV56;2


 
Je suis un peu perdu,
je peux avoir un fichier
ou l'ordre des colonnes peut être différent (exemple la colonne PEL se trouve avant RV34 et RSP à la fin)
, donc je ne peux pas me baser sur le numéro de colonne :

Citation :

Entreprise;Adresse;Code_E;Commande;Qte;Commande;Qte;Commande;Qte;Commande;Qte
ABB;Paris;12;PEL;5;RV34;4;RV56;8;RSP;19
Auchan;Nice;06;PEL;90;RV34;89;RV56;2;RSP;12


 
Merci,
pour votre aide  

Reply

Marsh Posté le 23-04-2015 à 17:55:00   

Reply

Marsh Posté le 23-04-2015 à 19:58:16    

moi je ferais comme suite :
- lecture ligne par ligne du fichier d'entrée
- extraction des champs avec awk
- et on crache ce qui nous intéresse dans les fichiers de sortie

Reply

Marsh Posté le 23-04-2015 à 22:18:53    

Un truc pondu vite fait, en perl:
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. my @lines;
  7. my $input = 'mycsv.txt';
  8. my $ouput1 = 'out1.txt';
  9. my $ouput2 = 'out2.txt';
  10.  
  11. open my $fh, "<", $input;
  12. while (<$fh> ) {
  13.  next if ($. <2);
  14.  my ($entreprise, $address, $code, %cmd) = split /;|\n/;
  15.  push @lines, [$entreprise, $address, $code, $cmd{RV34}, $cmd{RV56}];
  16. }
  17. close($fh);
  18.  
  19. open $fh, ">", $ouput1;
  20. print $fh "Entreprise;Adresse;Code_E;Commande;Qte;Commande;Qte\n";
  21. foreach (@lines) {
  22.  print $fh "$_->[0];$_->[1];$_->[2];RV34;$_->[3];RV56;$_->[4]\n";
  23. }
  24. close($fh);
  25.  
  26. open $fh, ">", $ouput2;
  27. print $fh "Entreprise;Adresse;Code_E;Commande;\n";
  28. foreach (@lines) {
  29.  print $fh "$_->[0];$_->[1];$_->[2];RV34;$_->[3]\n";
  30.  print $fh "$_->[0];$_->[1];$_->[2];RV56;$_->[4]\n";
  31. }
  32. close($fh);


 
et une variante, un peu plus verbeuse et explicite:
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. my @lines;
  7. my $input = 'mycsv.txt';
  8. my $ouput1 = 'out1.txt';
  9. my $ouput2 = 'out2.txt';
  10.  
  11. open my $fh, "<", $input;
  12. while (<$fh> ) {
  13.  next if ($. <2);
  14.  my ($entreprise, $address, $code, %cmd) = split /;|\n/;
  15.  push @lines, {Entreprise => $entreprise, Addresse => $address, Code => $code, RV34 => $cmd{RV34}, RV56 => $cmd{RV56}};
  16. }
  17. close($fh);
  18.  
  19. open $fh, ">", $ouput1;
  20. print $fh "Entreprise;Adresse;Code_E;Commande;Qte;Commande;Qte\n";
  21. foreach (@lines) {
  22.  print $fh "$_->{Entreprise};$_->{Addresse};$_->{Code};RV34;$_->{RV34};RV56;$_->{RV56}\n";
  23. }
  24. close($fh);
  25.  
  26. open $fh, ">", $ouput2;
  27. print $fh "Entreprise;Adresse;Code_E;Commande;\n";
  28. foreach (@lines) {
  29.  print $fh "$_->{Entreprise};$_->{Addresse};$_->{Code};RV34;$_->{RV34}\n";
  30.  print $fh "$_->{Entreprise};$_->{Addresse};$_->{Code};RV56;$_->{RV56}\n";
  31. }
  32. close($fh);


 
 
A+,


Message édité par gilou le 23-04-2015 à 22:29:34

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

Marsh Posté le 23-04-2015 à 22:29:43    

salut,
 

Citation :

- lecture ligne par ligne du fichier d'entrée

ça, awk le fait, donc c'est inutile.
 

Citation :

Je voudrais avoir 2 fichiers en sortie qui contiennent uniquement les commandes RV34 et RV56.


donc on se moque des PEL, et autres RSP.
 
voici un premier pseudo code:

Code :
  1. si la ligne contient "RVn" (où n est la représentation d'un nombre)
  2. alors
  3.    on conserve les 3 premiers champs dans une variable
  4.    on itère sur les autres champs,
  5.       si le champs commence par "RV"
  6.       alors
  7.          on concatène la variable des 3 premiers champs, avec le champs qui correspond au motif cherché, et avec le suivant dans une variable
  8.          on ajoute la variable des 3 premiers champs avec le champs qui correspond au motif cherché, et le suivant dans un fichier
  9.    à la fin de la boucle on ajoute la variable concaténée dans un second fichier

oui, dit comme ça, c'est pas super clair :/
 
avant de me lancer, je voudrais savoir si la première ligne est importante, et doit figurer dans les fichiers destination ?

Reply

Sujets relatifs:

Leave a Replay

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