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 :

Extraction de données dans un fichier txt


Sujet :

Langage Perl

  1. #21
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2014
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2014
    Messages : 84
    Points : 197
    Points
    197
    Par défaut
    Le scipt affiche 'use of an unitial...' car lors de l'exécution de la ligne
    "print "Société: $societe\nNuméro facture: $num_fact\nClient: $client\nN°client: $num_cli\n";", certaines variables ne sont pas valorisées. En fait leur valeur est 'undef', ce qui pose problème pour la concaténation.

    De plus pour renseigner $client, il faut sauter 2 lignes (en tout cas dans l'exemple de fichier fourni)

    ci dessous le code que j'ai modifié et qui fonctionne sur mon poste (sous windows) :
    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
    use strict;
    use warnings; 
     
    activerAccents();
    my $File = 'TODO :: Remettre le chemin du fichier  /facture.txt';
    open my $FILE, "<", $File or die "Ouverture impossible de $File $!";
    my ($societe, $num_fact, $client, $num_cli, $next_ligne);
    $societe = "";
    $num_fact = "";
    $client = "";
    $num_cli = "";
    while (<$FILE>) {
    	chomp;
    	$societe = $1 if /^Le nom de votre société\s+:\s+(\w+)/;
    	$num_fact = $1 if /^\s+F A C T U R E n°\s*(\d+)/;
    	if (/\s+Société  et\/ou  Nom  du  client :/) {
    		$next_ligne = <$FILE>;
    		$next_ligne = <$FILE>;
    		$client = $1 if $next_ligne =~ /\s+(\w+)/;
    	}
    	$num_cli = $1 if /^N°client\s+:\s+(\d+)/;
    	#print "$File";
     
    }
    print "Société: $societe\nNuméro facture: $num_fact\nClient: $client\nN°client: $num_cli\n";
     
     
    #########################################
    #### Procédure d'ectivation          ####
    #### des accents                     ####
    #########################################
    sub activerAccents {
    	my $encodage;
    	# Windows
    	if ( lc( $^O ) eq 'mswin32' ) {
    		eval {
    			my ($codepage) = ( `chcp` =~ m/:\s+(\d+)/ );
    			$encodage = "cp$codepage";
    			foreach my $h ( \*STDOUT, \*STDERR, ) {
    				binmode $h, ":encoding($encodage)";
    			}
    		};
    	}
    	else {
    		$encodage = `locale charmap`;
    		eval {
    			foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) {
    				binmode $h, ":encoding($encodage)";
    			}
    		};
    	}
    	return $encodage;
    }
    Résultat :
    Nom : perl_Lecture_fichier.JPG
Affichages : 106
Taille : 11,6 Ko

  2. #22
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 183
    Points : 32
    Points
    32
    Par défaut
    Bonjour,

    Je n'ai plus le problème d'initialisation mais lorsque j'exécute mon programme il ne me renvoie aucune valeur voici ci joint le fichier facture.txt:

    Voici mon code :
    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
     
    use strict;
    use warnings; 
     
    activerAccents();
     
    my $File = 'C:/Users/baranowp/Documents/2016_01_07_08/facture/facture.txt';
    open my $FILE, "<", $File or die "Ouverture impossible de $File $!";
     
    my ($societe, $num_fact, $client, $num_cli, $next_ligne);
    $societe = "";
    $num_fact = "";
    $client = "";
    $num_cli = "";
     
    while (<$FILE>) {
    	chomp;
    	$societe = $1 if /^Le nom de votre société\s+:\s+(\w+)/;
    	$num_fact = $1 if /^\s+F A C T U R E n°\s*(\d+)/;
    	if (/\s+Société  et\/ou  Nom  du  client :/) {
    		$next_ligne = <$FILE>;
    		$next_ligne = <$FILE>;
    		$client = $1 if $next_ligne =~ /\s+(\w+)/;
    	}
    	$num_cli = $1 if /^N°client\s+:\s+(\d+)/;
    	#print "$File";
     
    }
    print "Société: $societe\nNuméro facture: $num_fact\nClient: $client\nN°client: $num_cli\n";
     
     
    #########################################
    #### Procédure d'ectivation          ####
    #### des accents                     ####
    #########################################
    sub activerAccents {
    	my $encodage;
    	# Windows
    	if ( lc( $^O ) eq 'mswin32' ) {
    		eval {
    			my ($codepage) = ( `chcp` =~ m/:\s+(\d+)/ );
    			$encodage = "cp$codepage";
    			foreach my $h ( \*STDOUT, \*STDERR, ) {
    				binmode $h, ":encoding($encodage)";
    			}
    		};
    	}
    	else {
    		$encodage = `locale charmap`;
    		eval {
    			foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) {
    				binmode $h, ":encoding($encodage)";
    			}
    		};
    	}
    	return $encodage;
    }
    et voici la capture d'écran :
    Pièce jointe 198061

  3. #23
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2014
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2014
    Messages : 84
    Points : 197
    Points
    197
    Par défaut
    perl.exe et facture.pl sont dans le même répertoire ?

    j'ai testé sous powershell, et je n'ai pas eu de problème :
    Nom : perl_Lecture_fichier_02.JPG
Affichages : 104
Taille : 19,8 Ko

  4. #24
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 183
    Points : 32
    Points
    32
    Par défaut
    facture.txt se trouve dans C:\users\baranowp\Documents\2016_01_07_08\facture
    facture.pl se trouve dans C:\Perl\lib
    et chaque programme que j'ai dans ce répertoire C:\Perl\lib fonctionne avec la commande perl.exe

  5. #25
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 183
    Points : 32
    Points
    32
    Par défaut
    Le programme s'exécute bien mais il ne m'affiche pas le nom du client. J'ai repris ma facture de base qui était en PDF et je l'ai converti en txt et je n'ai rien modifié alors que peut-être que sur le fichier précédent j'ai du faire une modification voici ce que me renvoie ma capture d'écran :
    Pièce jointe 198074

  6. #26
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2014
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2014
    Messages : 84
    Points : 197
    Points
    197
    Par défaut
    Dans le dernier fichier texte fourni, le nom du client est sur la même ligne que le texte "Société et/ou Nom du client", alors que dans les versions précédentes, il fallait sauter 2 lignes pour l'obtenir.
    Autre point, le fichier texte est encodé en utf8-dos, pour mes tests je l'ai repassé en ascii (saut de ligne dos, cad \r\n )

    Pour le nom du client, j'ai modifié de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (/\s+Société  et\/ou  Nom  du  client :/) {
    		$next_ligne = <$FILE>;
    		$next_ligne = <$FILE>;
    		$client = $1 if $next_ligne =~ /\s+(\w+)/;
    }
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $client = $1 if /^\s+Société  et\/ou  Nom  du  client :\s+(\w+)/;

  7. #27
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 183
    Points : 32
    Points
    32
    Par défaut
    Maintenant je n'ai plus qu'à modifier ce code pour qu'il le fasse sur plusieurs factures.
    Merci beaucoup pour votre vous m'avez retiré une belle épingle du pied

  8. #28
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Je pense qu'il faut vraiment que tu lises les FAQ sur le débogage pour lesquels je t'ai donné le lien. Le genre d'incohérence entre le programme et les données que tu as eus est très courant, et il est probable que tu en aies d'autres avec tes autres factures. Il faut vraiment que tu apprennes à comprendre ce qui se passe par toi-même.

  9. #29
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 183
    Points : 32
    Points
    32
    Par défaut
    Bonjour,

    Comment puis-je modifier mon code afin qu'il m'extrait les différentes informations dans plusieurs facture parce que je pensais créer une boucle while pour chaque facture mais sa serait beaucoup trop long et lourd si j'ai 100 factures.
    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
     
    use strict;
    use warnings; 
     
    my $File = 'C:/Users/baranowp/Documents/2016_01_07_08/facture/facture.txt';
    open my $FILE, "<", $File or die "Ouverture impossible de $File $!";
     
    my $File1 = 'C:/Users/baranowp/Documents/2016_01_07_08/facture/facture1.txt';
    open my $FILE1, "<", $File1 or die "Ouverture impossible de $File1 $!";
     
    my ($societe, $num_fact, $client, $num_cli, $next_ligne);
    $societe = "";
    $num_fact = "";
    $client = "";
    $num_cli = "";
     
    while (<$FILE>) {
    	chomp;
    	$societe = $1 if /^Le nom de votre société\s+:\s+(\w+)/;
    	$num_fact = $1 if /^\s+F A C T U R E n°\s*(\d+)/;
    	if (/\s+Société  et\/ou  Nom  du  client :/) {
    		$next_ligne = <$FILE>;
    		$next_ligne = <$FILE>;
    		$client = $1 if /^\s+Société  et\/ou  Nom  du  client :\s+(\w+)/;
    	}
    	$num_cli = $1 if /^N°client\s+:\s+(\d+)/;
     
     }
     while (<$FILE1>) {
     
    	$societe = $1 if /^Le nom de votre société\s+:\s+(\w+)/;
    	$num_fact = $1 if /^\s+F A C T U R E n°\s*(\d+)/;
    	if (/\s+Société  et\/ou  Nom  du  client :/) {
    		$next_ligne = <$FILE1>;
    		$next_ligne = <$FILE1>;
    		$client = $1 if /^\s+Société  et\/ou  Nom  du  client :\s+(\w+)/;
    	}
    	$num_cli = $1 if /^N°client\s+:\s+(\d+)/;
     
     }
    print "Société: $societe\nFacture n°: $num_fact\nClient: $client\nN°client: $num_cli\n";
    Que pouvez-vous me conseiller pour réaliser cette tâche ?

    Est-ce que l'on peut utiliser un foreach ?

    Cordialement

  10. #30
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2014
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2014
    Messages : 84
    Points : 197
    Points
    197
    Par défaut
    il faut d'abord lister les fichiers présents dans le répertoire qui t'intéresse, et ensuite tu peux boucler sur cette liste.
    Il existe déjà beaucoup de code tout prêt dans ce forum je te laisse chercher, avec par exemple comme mot clé : 'getfileslist' ou une approximation de ce terme

  11. #31
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 183
    Points : 32
    Points
    32
    Par défaut
    lister tout les fichiers du répertoire concerné je l'ai fait.
    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
     
    use strict;
    use warnings; 
     
     sub GetFilesList
    {
            my $Path = $_[0];
            my $FileFound;
            my @FilesList=();
     
            # Lecture de la liste des fichiers
            opendir (my $FhRep, $Path)
                    or die "Impossible d'ouvrir le repertoire $Path\n";
            my @Contenu = grep { !/^\.\.?$/ } readdir($FhRep);
            closedir ($FhRep);
     
            foreach my $FileFound (@Contenu) {
                    # Traitement des fichiers
                    if ( -f "$Path/$FileFound") {
                            push ( @FilesList, "$Path/$FileFound" );
                    }
                    # Traitement des repertoires
                    elsif ( -d "$Path/$FileFound") {
                            # Boucle pour lancer la recherche en mode recursif
                            push (@FilesList, GetFilesList("$Path/$FileFound") );
                    }
     
            }
            return @FilesList;
    }
     
    my @Files = GetFilesList ('C:/Users/baranowp/Documents/2016_01_07_08/facture/');
    foreach my $File  (@Files) {
    	next unless $File =~ /\.txt$/i;
    	print "$File \n";
    }
     
    my $File = 'C:/Users/baranowp/Documents/2016_01_07_08/facture/facture.txt';
    open  $File, "<", $File or die "Ouverture impossible de $File $!";
     
    my ($societe, $num_fact, $client, $num_cli, $next_ligne);
    $societe = "";
    $num_fact = "";
    $client = "";
    $num_cli = "";
     
    while (<$File>) {
    	chomp;
    	$societe = $1 if /^Le nom de votre société\s+:\s+(\w+)/;
    	$num_fact = $1 if /^\s+F A C T U R E n°\s*(\d+)/;
    	if (/\s+Société  et\/ou  Nom  du  client :/) {
    		$next_ligne = <$File>;
    		$next_ligne = <$File>;
    		$client = $1 if /^\s+Société  et\/ou  Nom  du  client :\s+(\w+)/;
    	}
    	$num_cli = $1 if /^N°client\s+:\s+(\d+)/;
     }
     
     
    print "Société: $societe\nFacture n°: $num_fact\nClient: $client\nN°client: $num_cli\n";
    Maintenant je n'ai plus qu'à réaliser une boucle concernant toutes les factures sachant que les nom de mes factures .txt sont :
    facture.txt
    facture1.txt
    facture2.txt

    Pièce jointe 198685

  12. #32
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Il suffit que tout ton code (en bas du programme actuel) lisant une facture individuelle soit exécuté pour chaque facture de ta liste. Le plus simple est peut-être de mettre ce code de lecture d'une facture dans une fonction (subroutine) et d'appeler cette fonction pour chaque fichier de ta liste @Files (ou du moins chaque fichier de cette liste se terminant par".txt".

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Extraction de données dans un fichier
    Par bbrecords dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 20/08/2006, 18h45
  2. Comment créer une base de donnée dans un fichier .txt
    Par vantoff dans le forum C++Builder
    Réponses: 9
    Dernier message: 19/07/2006, 19h44
  3. Remplacer / Supprimer des données dans un fichier txt
    Par PedroBD dans le forum Langage
    Réponses: 3
    Dernier message: 03/07/2006, 13h33
  4. Extraction de données dans un fichier texte en VB6 !
    Par rockroa dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 21/06/2006, 16h00
  5. Extraction de donnés dans un fichier XML
    Par ANISSS dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 27/01/2006, 13h16

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