Programme de tri de fichier

Programme de tri de fichier - Divers - Programmation

Marsh Posté le 15-01-2013 à 15:37:04    

Bonjour, je dispose de plus de 5000 fichier pdf et chacun d'entre-eux porte un nom spécifique avec à chaque fois un numéro commun à plus fichiers ( numéro propriétaire ).
 
Je souhaites que les fichiers avec le même numéro propriétaire soit envoyé vers un dossier avec ce même numéro.
 
si quelqu'un connait une application déjà existante qui fait ce travail la, ou si quelqu'un sais avec quoi et/ou comment programmer une application de ce type, je suis ouvert à toutes informations.

Reply

Marsh Posté le 15-01-2013 à 15:37:04   

Reply

Marsh Posté le 15-01-2013 à 16:20:40    

Bonjour,
Sur quel système d'exploitation ?

Reply

Marsh Posté le 15-01-2013 à 16:39:01    

bonjour,  
soit sur du windows seven ou xp voir meme sur un serveur 2008 mais sur du windows en tout cas :)


Message édité par lodou le 15-01-2013 à 16:39:49
Reply

Marsh Posté le 15-01-2013 à 18:09:17    

Bien sur, l'id user et séparé du nom du fichier par un caractère ne pouvant exister ailleurs dans la chaîne du nom effectif des fichier ?

Reply

Marsh Posté le 15-01-2013 à 19:34:16    

C'est quelques lignes de Perl, ça.
Avec une regexp bien faite sur le nom de fichier, et un move dans le répertoire ad-hoc, créé s'il n'existe pas.
A+,


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

Marsh Posté le 16-01-2013 à 09:18:06    

Bonjour,  
je viens vous rajouter quelques précision, car je n'avais pas tout les éléments en main hier.
 
Déjà, le nom des fichiers et du type: avis_210536_012010. Le numéro entre crochet correspond au numéro qui servira à faire le tri ( ce numéro peut changer ne fonction du propriétaire ).
Ensuite, le tri sera principalement effectué pour un site sous joomla.
 
Dans ce site, lorsqu'un utilisateur va se connecter, il va être identifier par un numéro qui correspond au numéro entre les _.  
Une fois connecté l'utilisateur aura une arborescence dans laquelle les fichier comportant son numéro seront affichés.
 
Pour le moment, il faut que je trouve un moyen qui va me permettre de trier les fichier par nom dans des dossier comportant leur propre nom.
 
Je peut directement coder sur le site ou créer un programme qui triera les fichiers.


Message édité par lodou le 16-01-2013 à 09:28:45
Reply

Marsh Posté le 16-01-2013 à 12:16:41    

Tous tes fichiers sont dans le même répertoire au départ?
Les dossiers ou tu dois les ranger ont quel nom? le numéro identifiant le propriétaire ou le nom du propriétaire? Et dans ce dernier cas, d'ou sort la correspondance identifiant - nom?
 
En tout cas le principe est pas compliqué:
En supposant tes fichiers dans le même répertoire au départ.
1) tu récupère la liste des noms de fichier  
2) pour chaque fichier de la liste, tu extrait l'identifiant du milieu avec une expression régulière ad-hoc, et tu fais un move (ou une copie, selon tes besoins) de ce fichier vers le répertoire associé à ton identifiant (ou au nom qui lui est associé), répertoire que tu crées auparavant s'il n'existe pas.
 
A+,


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

Marsh Posté le 16-01-2013 à 13:52:34    

Tous les fichiers sont dans le même dossier.
Les dossier dans lesquels je doit ranger les fichier possède comme nom le numéro propriétaire qui est sur les fichiers et qui diffère selon le fichiers.

 

Pour le développement, si je pouvais avoir plus de précisions, car je suis assez novices dans le domaine surtout en perl que je n'ai jamais fait, cela va faire plus de 1 ans que je n'ai pas fait de développement et ou je n'avais que de petite bases.

 

Et ensuite, les dossier de réception seront créer sur un serveur distant et les fichiers qui seront à déplacer devront être envoyé via ftp.


Message édité par lodou le 16-01-2013 à 14:01:13
Reply

Marsh Posté le 16-01-2013 à 15:47:49    

La vous avez toutes les billes. Vous pouvez écrire cela en perl, python, ruby, ou tout autre langage un peu moderne qui sait maniper les systèmes de fichier,les expression régulières et utiliser une liaison ftp.
 
En perl ce serait qque chose comme:

Code :
  1. #!/usr/bin/perl
  2. use v5.10.1;
  3. # code propre
  4. use strict;
  5. use warnings;
  6. use autodie;
  7.  
  8. # my $dir = '/.../.../'; #mettre le répertoire correct ici
  9. my $dir = '.';
  10. #my $name_pattern = "avis_(\d+)_\d+";
  11. opendir(my $dh, $dir);
  12. my @files = grep { -f "$dir/$_" } readdir($dh); # on récupère laliste des fichiers
  13. closedir($dh);
  14.  
  15. my %transfer;
  16. foreach (@files) {
  17.  if (/^avis_(\d+)_\d+$/) { # si nom du fichier est 'avis_chiffres_chiffres'
  18.    if (defined $transfer{$1}) {
  19.      push $transfer{$1}, $_;
  20.    } else {
  21.      $transfer{$1} = [$_];
  22.    }
  23.  }
  24. }
  25.  
  26.  
  27.  
  28. use Net::FTP;
  29. my $remote_dir = '/.../.../'; #mettre le répertoire correct ici
  30. my ($domain, $username, $password) = ("some.host.name", "mylogin", "mypasswd" ); #idem pour les infos
  31. my $ftp = Net::FTP->new($domain, Debug => 0) or die "Cannot connect to $domain: $@";
  32. $ftp->login($username, $password) or die "Cannot login ", $ftp->message;
  33. $ftp->binary();
  34. $ftp->cwd("$remote_dir" ) or die "Cannot change to remote base $remote_dir ", $ftp->message;
  35. foreach my $rdir (keys %transfer) {
  36.  unless ($ftp->cwd("$rdir" )) {
  37.    $ftp->mkdir("$rdir" );
  38.    $ftp->cwd("$rdir" ) or die "Cannot change working directory to $_ ", $ftp->message;
  39.  }
  40.  foreach (@{$transfer{$rdir}}) {
  41.    $ftp->put("$_" ) or die "put $_ failed ", $ftp->message;
  42.  }
  43.  $ftp->cwd(".." ) or die "Cannot change back to remote base ", $ftp->message;
  44. }
  45. $ftp->quit;


 
c'est a adapter selon vos besoins, ici, il est supposé que les répertoires cibles sont tous situés dans un répertoire commun, $remote_dir, mais ça peut très bien être autrement enchangeant un peu le code.
 
A+,


Message édité par gilou le 16-01-2013 à 15:50:03

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

Marsh Posté le 16-01-2013 à 16:03:22    

Merci bien pour tous, je vais étudier votre code, le modifier pour mes besoin et voir si j'arrive à l'utiliser.

Reply

Marsh Posté le 16-01-2013 à 16:03:22   

Reply

Marsh Posté le 16-01-2013 à 16:15:09    

Pour comprendre la structure de donnée intermédiaire, transfer, si j'applique le code (sans la partie qui commence par use Net::FTP;) a un répertoire contenant 3 fichiers de noms avis_225_336 avis_225_337 et avis_226_338
j'obtiens pour transfer:
un hash (ou liste associative) avec deux clés, 225 et 226, la valeur associée à la première clé (225) est une liste a deux éléments, avis_225_336 et avis_225_337, et et la valeur associée à la seconde clé (226) est une liste a un élément, avis_226_338.
La première partie du code construit la structure de données %transfer à partir des données locales, et la seconde partie du code l'exploite pour procéder au transfert à distance et savoir quoi transférer et ou.
 
A+,


Message édité par gilou le 16-01-2013 à 16:16:57

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

Marsh Posté le 17-01-2013 à 09:05:25    

Ok, encore 1-2 question. Lorsque je doit mettre le nom du répertoire, je doit mettre le chemin complet genre c:\windows\systeme\... ?
Et avec quoi puis je faire un exécutable de ce script ?

Reply

Marsh Posté le 17-01-2013 à 13:44:00    

lodou a écrit :

Ok, encore 1-2 question. Lorsque je doit mettre le nom du répertoire, je doit mettre le chemin complet genre c:\windows\systeme\... ?
Et avec quoi puis je faire un exécutable de ce script ?

Le chemin complet si on n'exécute pas le script depuis ce répertoire.
Et c'est un script, donc on n'en fait pas un exécutable. Normalement, si l'installation de perl a été bien faite, le système reconnaîtra l'extension.pl pour le script (sous windows) ou la ligne #!/usr/bin/perl (sous linux) et fera exécuter ce script par l'interpréteur perl. On peut aussi faire enligne de commande: perl script.pl
 
A+,


Message édité par gilou le 17-01-2013 à 13:45:09

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

Sujets relatifs:

Leave a Replay

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