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 :

convertir avec iconv


Sujet :

Langage Perl

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 77
    Par défaut convertir avec iconv
    Bonjour à tous,

    j'ai un robot qui va extraire des fichiers issus de Medline et je cherche à convertir directement en sortie ces fichiers qui peuvent être en iso-8859-1 us-ascii ou utf-8. Manuellement, j'utilise la commande iconv, mais j'aimerai savoir si il est possible de l'insérer dans le script directement, de façon à ne plus avoir de fichiers encodés en iso-8859-1 en sortie mais que ceux-ci soient convertis en utf-8.

    Rappel : iconv -f inputencod -t outputencod inputfile > output file

    Voici mon script :

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
     
    #!/usr/bin/perl
     
     
    use strict;
     
    use WWW::Mechanize;
     
    binmode(STDOUT, ":utf8");
     
     
    @ARGV = ("../numnotices.txt");
     
     
    while (<>) {
     
    my $ua = WWW::Mechanize->new(agent => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15',
    			     cookie_jar => {} );
     
    my $url_pubmed = 'http://www.ncbi.nlm.nih.gov/pubmed';
     
    	my ($numero) = $_;
    	print"$_";
    #my $numero = "7957670";
    my $uid = $numero . "[uid]";
    my $url = $url_pubmed . "?term=" . $numero;
     
    my $reponse = $ua->get($url);
     
    if ( $reponse->is_success ) {
     
    	$reponse = $ua->post($url_pubmed, [
    			'EntrezSystem2.PEntrez.DbConnector.Db' => 'pubmed',
    			'EntrezSystem2.PEntrez.DbConnector.LastDb' => 'pubmed',
    			'EntrezSystem2.PEntrez.DbConnector.Term' => $uid,
    			'EntrezSystem2.PEntrez.DbConnector.LastTabCmd' => '',
    			'EntrezSystem2.PEntrez.DbConnector.LastQueryKey' => '1',
    			'EntrezSystem2.PEntrez.DbConnector.IdsFromResult' => '',
    			'EntrezSystem2.PEntrez.DbConnector.LastIdsFromResult' => '',
    			'EntrezSystem2.PEntrez.DbConnector.LinkName' => '',
    			'EntrezSystem2.PEntrez.DbConnector.LinkReadableName' => '',
    			'EntrezSystem2.PEntrez.DbConnector.LinkSrcDb' => '',
    			'EntrezSystem2.PEntrez.DbConnector.Cmd' => 'displaychanged',
    			'EntrezSystem2.PEntrez.DbConnector.TabCmd' => '',
    			'EntrezSystem2.PEntrez.DbConnector.QueryKey' => '',
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_SearchBar.SearchResourceList' => 'pubmed',
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_SearchBar.Term' => $uid,
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_SearchBar.FeedLimit' => '15',
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_SearchBar.FeedName' => $uid,
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_SearchBar.CurrDb' => 'pubmed',
    			'EntrezSystem2.PEntrez.Pubmed.Entrez_PageController.PreviousPageName' => 'results',
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.Pubmed_DisplayBar.sPresentation' => 'xml',
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.Pubmed_DisplayBar.FFormat' => 'abstract',
    			'email_format' => 'abstract',
    			'email_address' => '',
    			'email_add_text' => '',
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.Pubmed_DisplayBar.FileFormat' => 'abstract',
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.Pubmed_DisplayBar.LastPresentation' => 'abstract',
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.Pubmed_DisplayBar.Presentation' => 'xml',
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.Pubmed_DisplayBar.PageSize' => '20',
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.Pubmed_DisplayBar.LastPageSize' => '20',
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.Pubmed_DisplayBar.Sort' => '',
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.Pubmed_DisplayBar.LastSort' => '',
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.Pubmed_DisplayBar.FileSort' => '',
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.Pubmed_DisplayBar.Format' => 'text',
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.Pubmed_DisplayBar.LastFormat' => '',
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.Pubmed_ResultsController.ResultCount' => '1',
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.Pubmed_ResultsController.RunLastQuery' => '',
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.Pubmed_SingleItemSupl.Discovery_SearchDetails.SearchDetailsTerm' => $uid,
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.HistoryDisplay.Cmd' => 'displaychanged',
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.EmailTab.EmailReport' => '',
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.EmailTab.EmailFormat' => '',
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.EmailTab.EmailCount' => '',
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.EmailTab.EmailStart' => '',
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.EmailTab.EmailSort' => '',
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.EmailTab.Email' => '',
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.EmailTab.EmailText' => '',
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.EmailTab.EmailQueryKey' => '',
    			'EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.EmailTab.QueryDescription' => '',
    			'p%24a' => 'EntrezSystem2.PEntrez.Pubmed.Pubmed_ResultsPanel.Pubmed_DisplayBar.SetDisplay',
    			'p%24l' => 'EntrezSystem2',
    			'p%24st' => 'pubmed' ]);
     
    	if ( $reponse->is_success ) {
    		my $contenu = $ua->content();
    		print html2xml($contenu) . "\n";
    		}
    	else	{
    		my $status = $ua->status();
    		print STDERR "Echec [$status] pour POST \"$numero\"\n";
    		}
    	}
     
    else	{
    	my $status = $ua->status();
    	print STDERR "Echec [$status] pour GET \"$url\"\n";
    	}
     
     
     
     
     
    # remplacer les caractères de balises <, >
    sub html2xml
    {
    my $html = shift;
     
    $html =~ s|.+<pre>(.+)</pre>|$1|s;
    while ( $html =~ m|&lt;/(\w+)&gt;|o ) {
    	my $avant = $`;
    	my $apres = $';
    	my $tag = $1;
    	$avant =~ s|^(.*)&lt;($tag(\s+\w+=\".+?\")*)&gt;|$1<$2>|s;
    	$html = $avant . "</$tag>" . $apres;
    	}
    # retourner en une seule ligne
    #$html =~ s|\n[\t ]*||go;
    #print $html;
     
    			open my $fh, ">>id$_";  
    			print {$fh} $html;
    #return $html;
    }								
    }
    exit 0;

    Je joins le fichier numnotices.txt pris en ARG.

    Merci d'avance de votre aide.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Par défaut
    j'ai eu le même souci il y a peu.

    voici le bout de code que j'avais réalisé:

    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
     
    #!/usr/bin/perl
     
    use strict;
    use warnings;
    use Encode;
    require Encode::Detect;
     
    my @lines;
    my $string;
    my $stringout;
     
    # Ouvre le fichier en lecture sans se préoccuper du format de celui-ci.
    open (FILE, "<",$ARGV[0]) || die "Ouverture impossible du fichier $ARGV[0]: $!";
    @lines = <FILE>;
    close (FILE);
     
    # Ouvre le fichier de sortie que l'on force en utf-8
    open(my $out,'>:encoding(utf-8)',"result.txt");
     
    # On parcours les lignes du fichier
    for (my $i=0; $i<scalar(@lines); $i++)
    {
    	# on détecte le format d'encodage de chaque ligne et on la réencode en utf-8
    	$lines[$i] = encode("utf-8", decode("Detect", $lines[$i]));
      print $out $lines[$i];
    }
    close ($out);
    En gros on ouvre le fichier en lecture, et on détecte l'encodage ligne par ligne pour les réencoder dans le format voulut.

    D'après mes recherches, je n'ai rien trouvé pour travailler de manière globale sur un fichier, on doit toujours passer par un traitement ligne par ligne.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 77
    Par défaut
    Merci mais sachant qu'il existe la commande iconv qui fait ça très bien, je voulais savoir si il était possible de l'intégrer dans mon script et si oui par quel moyen ?

    Merci d'avance.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Par défaut
    en perl, il y a les fonction "exec" et "system" qui permettent d'éxécuter des commandes shell à l’intérieur d'un script perl

    tu peux aussi tout simplement écrire comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @result = `iconv -f inputencod -t outputencod inputfile > output file`;

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 77
    Par défaut
    J'ai déjà essayer d'insérer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    exec 'for fchier in id*; do iconv -f iso-8859-1 -t utf-8 $fichier > $fichier-conv; done';
    Mais rien n'y fait je me retrouve avec de l'iso.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Par défaut
    essaie avec la commande que je t'ai donné

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @result =  `for fchier in id*; do iconv -f iso-8859-1 -t utf-8 $fichier > $fichier-conv; done`;

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 77
    Par défaut
    Et je la place à quel endroit dans le script.

    Je sais je suis un boulet mais auto ditacte en Perl

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Par défaut
    J'en sais rien...

    ta commande iconv, tu l'execute que le script perl est terminé?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 77
    Par défaut
    Oui donc logiquement je devrais la mettre à la fin c'est ça ?

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 77
    Par défaut
    ça m'affiche cela comme erreur :

    Global symbol "$fichier" requires explicit package name at ../Interrogation-Medline2.pl line 134

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Par défaut
    J'imagine

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 77
    Par défaut
    J'ai tout essayé et... rien :'(

  13. #13
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @result =  `for fichier in id*; do iconv -f iso-8859-1 -t utf-8 $fichier > $fichier-conv; done`;
    (il manquait un i dans "fichier" après "for".

    Cela dit, ça ne suffit pas à expliquer l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @result =  qx'for fichier in id*; do iconv -f iso-8859-1 -t utf-8 $fichier > $fichier-conv; done';
    (afin d'éviter l'interprétation de $fichier).

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 77
    Par défaut
    Merci Philou j'avais bien vu l'erreur mais j'ai essayé de corriger et de mettre ta commande et rien ne change. Tu l'insèrerais où ta ligne my @result... ?

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Par défaut
    juste pour info,

    la commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @result =  qx'for fichier in id*; do iconv -f iso-8859-1 -t utf-8 $fichier > $fichier-conv; done';
    stock le résultat de l'affichage dans le tableau @result

    si tu mets à la place:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    my @result =  qx'for fichier in id*; do iconv -f iso-8859-1 -t utf-8 $fichier > $fichier-conv; done';
     
    for (my $i=0; $i<scalar(@result); $i++)
    {
        print $result[$i]."\n";
    }
    cela t'affiche quoi?

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 77
    Par défaut
    Cela ne change rien que je le mette n'importe où

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 77
    Par défaut
    Je récapitule ce que je souhaite faire :

    récupérer des notices issues de Medline, avec une notice/fichier. Et les notices extraites en iso-8859-1 doivent être converties en utf-8.

    Pour ce faire, j'ai le script perl (voir début du fil de discussion) et je connais la commande iconv.

    Le problème est comment mélanger les deux ?

    Encore merci.

  18. #18
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Que donne ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my @result =  qx'for fichier in id*; do echo iconv -f iso-8859-1 -t utf-8 $fichier > $fichier-conv; done';
     
    print @result;
    A LANCER DANS LE REPERTOIRE où se trouvent les fichiers id*

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 77
    Par défaut
    Tu veux que je le teste en l'intégrant à quel endroit dans le code ?

  20. #20
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Lance le déjà tout seul, dans le répertoire où se trouvent les fichiers id*

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

Discussions similaires

  1. Convertir un entier en caractère avec des 0 devant
    Par Oluha dans le forum Développement
    Réponses: 12
    Dernier message: 28/08/2017, 14h37
  2. convertir avec un programme tcs les codes
    Par l1informatique dans le forum Shell et commandes GNU
    Réponses: 0
    Dernier message: 20/05/2014, 01h11
  3. Problème avec iconv et boucle for
    Par Invité dans le forum Débuter
    Réponses: 5
    Dernier message: 10/03/2013, 20h47
  4. Problèmes de conversion avec iconv
    Par Beho Double dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 28/04/2011, 17h30
  5. Convertir un texte en OEM avec Notepad++
    Par Furius dans le forum Autres Logiciels
    Réponses: 17
    Dernier message: 17/10/2005, 14h18

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