IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Importation des données à partir d'un serveur FTP


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 15
    Points : 5
    Points
    5
    Par défaut Importation des données à partir d'un serveur FTP
    Bonjour à tous,

    Je suis confronté dans mon travail à un problème que je n'arrive pas à résoudre.

    Je dois :
    1. importer sur un serveur local toutes les données se trouvant sur ftp://ftp.ensembl.org/pub/current_genbank/
    2. chaque dossier correspond à un organisme et contient desfichiers compressés avec gunzip. Donc je dois décompresser les fichiers de chaque dossier, les fusionner dans un même fichier et renomer ce nouveau fichier avec le nom du dossier dans lequel il se trouve avec l'extension .dat
    3. créer un nouveau dossier en dehors des dossiers importer et y mettre tous les fichiers nouvellement créés à l'étape 2.
    Je vous en prie, aidez-moi, je ne maitrise pas très bien perl et cette partie bloque tout mon travail.

    Merci d'avance

  2. #2
    Membre éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    Par défaut
    commence donc par chercher un peu de documentation...

    par exemple sur le site http://search.cpan.org/

    au sujet des modules IO::Uncompress::AnyInflate ou Net::FTP ...
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Gardyen Voir le message
    commence donc par chercher un peu de documentation...

    par exemple sur le site http://search.cpan.org/

    au sujet des modules IO::Uncompress::AnyInflate ou Net::FTP ...

    Merci pour ta réponse.

    J'ai besoin d'une fonction ne faisant pas appel à des modules externes car je dois pas modifier l'installation de quoi que ce soit sur le serveur.

    En gros, j'ai des restrictions au niveau du serveur.


    Merci

  4. #4
    Membre éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    Par défaut
    net::Ftp devrait être installé par défaut avec Perl, vérifie quand même

    pour io::uncompress je ne pense pas, mais tu peux "tricher" un peu en utilisant la fonction system, en supposant que gunzip soit installé sur ton serveur ...
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  5. #5
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Je t'aurais conseillé de tout faire en perl pour une question de portabilité. Mais bon, je ne sais pas sur quel OS tu travail, Win, Linux?
    Si tu es sous linux, et que tu ne peux vraiment pas installer de modules perl comme Net::FTP, ou même Net::FTP::Recursive , ainsi que Archive::Extract, tu pourrais faire une bonne partie en ligne de commande.
    Tu pourrais faire un script perl dans lequel tu ferais déjà quelques commandes system (telque wget -r, pour telecharger tout). Même si je ne trouve pas ça tres propre.
    Ensuite à toi de parcourir les repertoires en perl afin de dezipper les fichiers un à un via gzip (encore faut il qu'il soit installé sur ton serveur).
    Et ensuite, tu peux faire le reste en perl.
    A toi de réfléchir, sur les étapes de ton script, sur ton algorithme et de nous proposer un script.
    On ne pourra pas le faire à ta place.
    courage

  6. #6
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Net::FTP est déjà disponible par défaut avec Perl, tu n'auras qu'à compléter avec un petit appel à gunzip (consulte la FAQ pour savoir comment exécuter une commande).

    --
    Jedaï

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par djibril Voir le message
    Je t'aurais conseillé de tout faire en perl pour une question de portabilité. Mais bon, je ne sais pas sur quel OS tu travail, Win, Linux?
    Si tu es sous linux, et que tu ne peux vraiment pas installer de modules perl comme Net::FTP, ou même Net::FTP::Recursive , ainsi que Archive::Extract, tu pourrais faire une bonne partie en ligne de commande.
    Tu pourrais faire un script perl dans lequel tu ferais déjà quelques commandes system (telque wget -r, pour telecharger tout). Même si je ne trouve pas ça tres propre.
    Ensuite à toi de parcourir les repertoires en perl afin de dezipper les fichiers un à un via gzip (encore faut il qu'il soit installé sur ton serveur).
    Et ensuite, tu peux faire le reste en perl.
    A toi de réfléchir, sur les étapes de ton script, sur ton algorithme et de nous proposer un script.
    On ne pourra pas le faire à ta place.
    courage

    Merci pour vos conseils,

    Je travaille sur opensuse 10.2

    Je conçois une base de donnée biologique fédérant les informations provenant d'autres bases/banques de données biologiques comme GenBank de la NCBI et ENSEMBL (désolé pour les termes crus du domaine, mais j'ai pas le choix) et des publications se trouvant sur le web.

    La partie pour parser les informations sur le web est déjà faite.

    Mais j'ai été bloqué sur les fichiers GenBank et la structure de stockage des fichiers dans leur banque.

    La partie terminée, j'ai utilisé PHP/MySQL/AJAX.

    Un ami m'a conseillé d'utiliser Perl pour récupérer des infos sur Genbank mais comme je suis débutant en Perl, j'ai préféré demandé de l'aide étant donné que mon temps est très limité pour apprendre correctement Perl.


    Bien à toi
    En gros c'est ça.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Jedai Voir le message
    Net::FTP est déjà disponible par défaut avec Perl, tu n'auras qu'à compléter avec un petit appel à gunzip (consulte la FAQ pour savoir comment exécuter une commande).

    --
    Jedaï
    Merci.


    Je pense que je vais essayer avec Net::FTP (Je n'ai pas le choix)

    Merci encore

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Voilà, j'ai essayé avec Net::FTP comme vous me l'avez conseillé.
    Juste pour essayer de récupérer les fichiers mais je ne vois pas pourquoi il ne les récupère pas

    Error:
    Can't get file list
    Voici le code utilisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    #!/usr/bin/perl
    use Net::FTP;
     
    my $host="ftp.ensembl.org";
    my $directory="pub/current_genbank";
     
    $ftp=Net::FTP->new($host,Timeout=>240) or $newerr=1;
      push @ERRORS, "Can't ftp to $host: $!\n" if $newerr;
      myerr() if $newerr;
    print "Connected\n";
     
    $ftp->login("anonymous","anonymous") or $newerr=1;
    print "Getting file list";
      push @ERRORS, "Can't login to $host: $!\n" if $newerr;
      $ftp->quit if $newerr;
      myerr() if $newerr; 
    print "Logged in\n";
     
    $ftp->cwd($directory) or $newerr=1; 
      push @ERRORS, "Can't cd  $!\n" if $newerr;
      myerr() if $newerr;
      $ftp->quit if $newerr;
     
    @files=$ftp->dir or $newerr=1;
      push @ERRORS, "Can't get file list $!\n" if $newerr;
      myerr() if $newerr;
    print "Got  file list\n";   
    foreach(@files) {
      print "$_\n";
      }
    $ftp->quit;
     
     
    sub myerr {
      print "Error: \n";
      print @ERRORS;
      exit 0;
    }

  10. #10
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Bon je te met un code pour te permettre te telecharger un fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/usr/bin/perl
    use Net::FTP;
    use warnings,
    use strict;
     
    my $host="ftp.ensembl.org";
    my $directory="pub/current_genbank";
    my ($login, $pass) = ("anonymous","anonymous");
    my $fichier = "xxxxxx.txt";
    my $ftp = Net::FTP->new($host, Debug => 0) 
        or die("$! impossible de trouver l'url $host!!");
    $ftp->login($login,'-$pass');
    $ftp->cwd("$directory/");
    $ftp->binary;
    $ftp->get($fichier) or die"get failed ", $ftp->message;
    print "fichier $fichier telecharge\n";
    $ftp->quit();
    Maintenant, faut savoir que get te permet de telecharger un fichier.
    toi tu utilise la methode dir qui ne fait que faire un dir sur le serveur ftp, donc ne te sert pas à telecharger. D'ailleur c'est plutot mieux de faire un ls.
    Maintenant à toi de reflechir sur l'algo car une fois dans le repertoire pub/current_genbank on n'a que des repertoires. Donc faudra penser à faire des cwd pour y rentrer, lister les fichiers à l'interieur, telecharger ce que tu veux. puis revenir d'un cran etc.

    Donc sachant que tu veux vraiment telecharger plusieurs fichiers recursivement dans des repertoires, je te conseillé le module Net::FTP::Recursive qui n'est pas par defaut dans le core. Mais bon, si tu ne peux pas le telecharger, tout est toujours faisable avec Net::FTP

    Allez courage

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    J'ai pu avoir les droits d'installation sur le serveur.

    J'ai installé Net::FTP::Recursive et j'ai essayé le script suivant:

    #!/usr/bin/perl
    use Net::FTP::Recursive;

    $ftp = Net::FTP::Recursive->new("ftp.ensembl.org", Debug => 0);

    $ftp->login("anonymous",'kargero@gmail.com');

    $ftp->cwd('/pub/current_genbank');

    $ftp->rget( ParseSub => \&yoursub );

    $ftp->quit;
    Malheureusement un message d'erreur que je n'arrive pas à comprendre s'affiche :
    Undefined subroutine &main::yoursub called at line /usr/lib/perl5/site_perl/5.8.8/Net/FTP/Recursive.pm line 77
    Je ne comprend rien de ce message franchement parlant.

  12. #12
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    #!/usr/bin/perl
    use warnings;
    use strict;
    use Carp;
    use Net::FTP::Recursive;
     
    my $host = "ftp.ensembl.org";
    my $ftp = Net::FTP::Recursive->new($host, Debug => 0) or die "Cannot connect to $host: $@";
    my ($login,$password) = ("anonymous",'kargero@gmail.com');
    $ftp->login($login,$password) or die "Cannot login ($login)", $ftp->message;
    $ftp->cwd('/pub/current_genbank');
    $ftp->binary;
     
    print  "telechargement en cours\n\n";
    $ftp->rget( MatchDirs  => ".*" );
    $ftp->quit;
    print  "Fini\n";

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Merci Djibril,

    Aucune erreur ne s'affiche mais il ne télécharge rien non plus.

    Le script s'exécute et après deux minutes il affiche "Fini".

    Ce qui montre qu'il s'exécute réellement.

    Mais je ne vois aucun dossier ni fichier téléchargés



    Citation Envoyé par djibril Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    #!/usr/bin/perl
    use warnings;
    use strict;
    use Carp;
    use Net::FTP::Recursive;
     
    my $host = "ftp.ensembl.org";
    my $ftp = Net::FTP::Recursive->new($host, Debug => 0) or die "Cannot connect to $host: $@";
    my ($login,$password) = ("anonymous",'kargero@gmail.com');
    $ftp->login($login,$password) or die "Cannot login ($login)", $ftp->message;
    $ftp->cwd('/pub/current_genbank');
    $ftp->binary;
     
    print  "telechargement en cours\n\n";
    $ftp->rget( MatchDirs  => ".*" );
    $ftp->quit;
    print  "Fini\n";

  14. #14
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    bah ecoute, je ne sais pas. De mon coté, en l'executant il telecharge tout ce qu'il faut dans le repertoire courant. Ce qui est d'ailleurs tres tres long vu qu'il telecharge tout.

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    J'accède au serveur à distance, je ne sais pas si c'est ce qui pose de problèmes (mais ça m'étonnerait, car d'autres scripts fonctionnent à merveille).

    J'ai essayé de me loguer à partir d'une autre machine mais c'est toujours la même chose.

    Comme quoi, quand ça ne va pas ...

    Merci quand même. Je vais continuer à chercher ce qui croche.

    Citation Envoyé par djibril Voir le message
    bah ecoute, je ne sais pas. De mon coté, en l'executant il telecharge tout ce qu'il faut dans le repertoire courant. Ce qui est d'ailleurs tres tres long vu qu'il telecharge tout.

  16. #16
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    y a pas un probleme de droit d'ecriture de ton script dans le repertoire ou autre. ou bien un souci de firewall, je ne sais pas

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Oui,

    Je suis derrière un firewall, mais je ne pensais pas que ça pouvait avoir un effet

    Citation Envoyé par djibril Voir le message
    y a pas un probleme de droit d'ecriture de ton script dans le repertoire ou autre. ou bien un souci de firewall, je ne sais pas

  18. #18
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Salut Djibril,

    Peux-tu m'expliquer cette ligne dans le code ?

    $ftp->rget( MatchDirs => ".*" );
    Les fichiers téléchargés vont où ? Dans le répertoire courant ?

  19. #19
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    il va dans les repertoire qui match avec cette regex. donc tous les repertoires.
    Et tout est telechargé dans le repertoire courant

  20. #20
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    J'ai fait le tour du problème, mais ça ne télécharge rien.

    Je ne sais plus quoi faire.


    Citation Envoyé par djibril Voir le message
    il va dans les repertoire qui match avec cette regex. donc tous les repertoires.
    Et tout est telechargé dans le repertoire courant

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. extraire des fichiers à partir d'un serveur FTP
    Par ons_sno dans le forum Bases de données
    Réponses: 1
    Dernier message: 30/06/2010, 13h39
  2. Afficher des données à partir d'un serveur distant
    Par Landolsi dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 13/06/2010, 11h24
  3. [Débutant] Probleme d'importation des données à partir des fichiers textes
    Par bahja29 dans le forum MATLAB
    Réponses: 3
    Dernier message: 12/03/2009, 16h28
  4. Réponses: 8
    Dernier message: 22/08/2006, 12h51
  5. [SQLCE 2000] Importer des données à partir de fichiers
    Par Friz dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/03/2006, 19h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo