Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
786 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  question

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

question

n°2264608
Henri772
Posté le 19-08-2015 à 23:23:15  profilanswer
 

Salut  
J'ai une Question:
je possede 2 codes nommons les code1 et code2
j'esxecute code1 et il me retourne par-exemple:
papa
titi
toto
tata
tutu
pipi
 
j'execute code2 il me retourne par-exemple:
titi  
toto
pipi
 
j'explique le procede es qu'il est possible qu'un code2 va dans le dossier ou code1 a stocke son renvoi chercher un certain nombre de  
fichiers donc il trouve que ceux ci remplice les conditions donc il cherche les ouvrent(sans toute fois efface ce qui etait deja ecrit dans le fichier) et puis  
ecrit aussi des donnes sur ces fichiers et puis le revoit a son tour.
dans un autre dossier.
c'est jute pour savoir si cela st possible , car j'ai un probleme donc je pense que cela peut etres resolu de la sorte.
 
Merci bien.

mood
Publicité
Posté le 19-08-2015 à 23:23:15  profilanswer
 

n°2264610
gilou
Modérateur
Modzilla
Posté le 20-08-2015 à 01:24:53  profilanswer
 

C'est possible.
Mais souvent superflu.
Si on a un script A qui écrit dans des fichiers, et que ces fichiers ne servent qu'a être exploités par un Script B, et à rien d'autre, ça veut dire, sauf cas très particulier, qu'on pourrait avoir un script C qui fait tout d'un coup et de manière plus efficace.
En particulier, au lieu d'écrire dans un fichier, on pourrait donc écrire dans une variable de type chaîne de caractères, et lire le contenu de cette variable ensuite.
 
A+,


Message édité par gilou le 20-08-2015 à 01:27:03

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2264621
Henri772
Posté le 20-08-2015 à 11:57:55  profilanswer
 

Salut Gilou
c'etait pour faire allusion au probleme que je te presentais la derniere fois lorque je voulais que 2 codes ecrivent dans le meme fichier, car je pense que c'est pour cette option que je vais me penche car je ne connais pas d'autre moyens.  ou alors peus tu avoir une autre Idee? plus facile.

n°2264626
gilou
Modérateur
Modzilla
Posté le 20-08-2015 à 14:02:45  profilanswer
 

Comme je t'ai dit, puisque tu as un code B qui utilise les résultats d'un code A, pourquoi ne fait tu pas un code unique? S'il n'y a pas de raison spéciale, autant faire un seul script.
 
Si c'est pour écrire les résultats du code A, suffit de faire des  
push @resultat "truc a ecrire\n";
au lieu de faire
print $fh "truc a ecrire\n";
et tout est écrit dans une liste, qu'on peut passer a l'autre code
 
et a la lecture par le code B, faire un
while ( @resultat )
au lieu d'un  
while (<$fh> )
 
et le tour est joué.
 
A priori en perl, on évite les fichiers temporaires, qui sont très inefficaces (sauf cas de limitation en mémoire). On n'écrit dans des fichiers que les fichiers finaux.
 
A+,

Message cité 1 fois
Message édité par gilou le 20-08-2015 à 14:04:57

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2264641
Henri772
Posté le 20-08-2015 à 23:41:40  profilanswer
 

j'ai edite ma question, peut etre celle ci tu pourra m'aider merci d'avance, en voici le code
 

Code :


 
 le code B (deuxieme) traite un DATA2.csv et ecrit dans des fichiers, car dans le DATA2.csv les noms par exmple
DPA01 DPA02 DPA03 revient plusieurs fois en avec les memes donnes il les reecrit dans le meme fichier plusieurs fois
et au finisch on a comme l'inpression qu'il ne l'a fait qu'une fois, maintenant j'aimerai qu'il ecrive les resultats juste une fois car les noms reviennent a chaque fois avec les memes donnes donc l'ecrire juste une fois et ignorer tout ce suivra, et passe au nom suivant soit DPA02 faire la meme chose ecrire les donnes une fois et ignore tous ceux qui suivrent.
 
es ce que tu peus m'aider a ce niveau? merci bien


Message édité par Henri772 le 26-08-2015 à 00:47:17
n°2264655
Henri772
Posté le 21-08-2015 à 11:32:00  profilanswer
 

gilou a écrit :

Comme je t'ai dit, puisque tu as un code B qui utilise les résultats d'un code A, pourquoi ne fait tu pas un code unique? S'il n'y a pas de raison spéciale, autant faire un seul script.
 
Si c'est pour écrire les résultats du code A, suffit de faire des  
push @resultat "truc a ecrire\n";
au lieu de faire
print $fh "truc a ecrire\n";
et tout est écrit dans une liste, qu'on peut passer a l'autre code
 
et a la lecture par le code B, faire un
while ( @resultat )
au lieu d'un  
while (<$fh> )
 
et le tour est joué.
 
A priori en perl, on évite les fichiers temporaires, qui sont très inefficaces (sauf cas de limitation en mémoire). On n'écrit dans des fichiers que les fichiers finaux.
 
A+,


 
je crois qu'a ce niveau il ya probleme lorsque tu ecris
 
while ( @resultat )
au lieu d'un  
while (<$fh> )
 
le fichier donc traite le code A est diffenrent de celu donc traite le code B, donc en lisant juste @resultat  il faudre aussi qu'il traite le fichier donc sense le faire.

n°2264700
Henri772
Posté le 23-08-2015 à 17:00:25  profilanswer
 

Salut Gilou j#ai eu a essayer ta propositon ca na pas malheureusement pas marche je parle de ceci
 
Si c'est pour écrire les résultats du code A, suffit de faire des  
push @resultat "truc a ecrire\n";
au lieu de faire
print $fh "truc a ecrire\n";
et tout est écrit dans une liste, qu'on peut passer a l'autre code
 
et a la lecture par le code B, faire un
while ( @resultat )
au lieu d'un  
while (<$fh> )
 
et le tour est joué.


Message édité par Henri772 le 23-08-2015 à 17:01:00
n°2264703
gilou
Modérateur
Modzilla
Posté le 23-08-2015 à 18:31:32  profilanswer
 

Oui, c'est un foreach ( @resultat ) et non pas un while qu'il faut faire, bien sur, si c'est une boucle sur un array non modifié.
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. my @pseudofile;
  7.  
  8. sub scriptA {
  9.  my $linenum = 0;
  10.  # on écrit un nombre aléatoires de lignes
  11.  foreach (0..(int(rand(10)))) {
  12.    push @pseudofile, "Ligne ".++$linenum."\n";
  13.  }
  14. }
  15.  
  16. sub scriptB {
  17.  # on lit les données écrites et on les envoies à la console
  18.  foreach (@pseudofile) {
  19.    print "$_";
  20.  }
  21. }
  22.  
  23. scriptA();
  24. scriptB();


 
Il y a aussi la variante

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. my $memoryfile;
  7.  
  8. sub scriptA {
  9.  my $linenum = 0;
  10.  open my $fh, '>', \$memoryfile;
  11.  # on écrit un nombre aléatoires de lignes
  12.  foreach (0..(int(rand(10)))) {
  13.    print $fh "Ligne ".++$linenum."\n";
  14.  }
  15.  close $fh;
  16. }
  17.  
  18. sub scriptB {
  19.  open my $fh, '<', \$memoryfile;
  20.  # on lit les données écrites et on les envoies à la console
  21.  while (<$fh> ) {
  22.    print "$_";
  23.  }
  24.  close $fh;
  25. }
  26.  
  27. scriptA();
  28. scriptB();


 
A+,


Message édité par gilou le 23-08-2015 à 18:47:34

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2264710
Henri772
Posté le 24-08-2015 à 00:13:39  profilanswer
 

merci bien ,tu trouveras peut etre la question bête comment fonctionne ce code


Message édité par Henri772 le 24-08-2015 à 00:14:43
n°2264712
gilou
Modérateur
Modzilla
Posté le 24-08-2015 à 02:33:47  profilanswer
 

Oui, je comprends pas ta question.
Le premier exemple utilise une liste et le second une zone mémoire accédée comme si c'était un fichier.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
mood
Publicité
Posté le 24-08-2015 à 02:33:47  profilanswer
 

n°2264713
Henri772
Posté le 24-08-2015 à 07:34:42  profilanswer
 

la question est de svoir si je voulais applique l'un des exemple a mon cas precis comment dois je m'y prendre.
je dois cree un dossier sur C dans le quel je je mets le script A et B et maintenant dans perl command line que dois je tape?
 
 
salut  
que dois je change dans mon regex de maniere a ce que les valeurs 0 soit considere
 
sub clean {    
    my $string = shift;
    $string =~ s/^\s+//;
    $string =~ s/\s+$//;
    return $string;
}


Message édité par Henri772 le 24-08-2015 à 13:33:29
n°2264726
gilou
Modérateur
Modzilla
Posté le 24-08-2015 à 16:19:20  profilanswer
 

Ça veut dire quoi, "que les valeurs 0 soit considere" ?
Sans plus d'explication, ça veut rien dire.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2264737
Henri772
Posté le 24-08-2015 à 19:11:24  profilanswer
 

Merci bien a ta reaction j'ai oublie de mensionner que j'e l'ai resolu.
je sais pas comment je dois applique l'un des 2 codes a mon probleme
 
d'apres toi pourquoi ce script ne me retourne aucun resultat ($FileResult_0)
 
 

Code :
  1. #!/usr/local/bin/perl -w
  2. use strict;
  3. use warnings;
  4. use XML::Twig; 
  5. use POSIX qw(strftime);
  6.                  
  7. my $date_1 = strftime "%Y%m%d %H:%M:%S", localtime;
  8. my $file1 = $ARGV[0] || die 'No file1';   
  9. my $file2 = $ARGV[1] || die 'No file2'; 
  10. my $FileResult_0 = $ARGV[2] || 'defaultwerte.html';
  11. my $FileResult_1 = $ARGV[3] || 'defaultwerte.csv';
  12. open( my $FhResult_0, '>>', $FileResult_0 ) or die("Unable to open file $FileResult_0\n$!" );
  13. open( my $FhResult_1, '>', $FileResult_1 ) or die("Unable to open file $FileResult_1\n$!" );
  14. print $FhResult_1 $date_1, "\n";
  15. my $twig1= XML::Twig->new(   
  16.         twig_handlers => {   
  17.                 'Parameter' => sub {
  18.                        
  19.                              
  20.                         my $attr_name = $_->{'att'}->{'name'};
  21.                         print $FhResult_1 $attr_name . ", ";
  22.                 },
  23.         },
  24. );
  25. print $FhResult_1( (split('_', $file1,2))[0] . ', ' );
  26. $twig1->parsefile($file1);
  27. my $twig2= XML::Twig->new(   
  28.         twig_handlers => {
  29.                 'Parameter' => sub {
  30.                        
  31.                         my $attr_value = $_->{'att'}->{'value'} // '';  
  32.                         print $FhResult_1 $attr_value . ", ";
  33.                 },
  34.         },
  35. );
  36. print $FhResult_1( (split('_', "\n$file2",2))[0] . ', ' );
  37. $twig2->parsefile($file2);
  38. my $twig= XML::Twig->new
  39.         twig_handlers => {
  40.                 'Parameter' => sub {
  41.      my $attr_name  = $_->{'att'}->{'name'}  // '';    
  42.                         my $attr_value = $_->{'att'}->{'value'} // '';  
  43.                         print $FhResult_0 "\n <tr><td>$attr_name</td><td>$attr_value</td></tr>";
  44.                 },
  45.         },
  46. );
  47. print $FhResult_0 ( (split('_', "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">
  48. <html>
  49. <head>
  50.    <title>PARAMETERS</title>
  51.    <meta charset=\"UTF-8\"/>
  52.    <link href=\"defaultwerte.css\" type=\"text/css\" rel=\"stylesheet\"/>
  53. </head>
  54. <body>\n<div id=\"c1\">\n<table>\n<tr><th>$file1:",2))[0] . "</th></tr>" );
  55. $twig->parsefile($file2);
  56. print $FhResult_0 "\n<table>\n</body>\n</html>";
  57. use strict;
  58. use warnings;
  59. use Text::CSV;
  60. my $csv = Text::CSV->new;
  61. open my $csv_file, "<", "DATA2.csv" or die "Can't open CSV file: $!\n";
  62. while (my $row = $csv->getline($csv_file)) {
  63.    
  64.     my($significator_and_file) = clean($row->[0]);
  65.     my ($significator, $file) = split /\s+/, $significator_and_file;
  66.     next unless $significator and $significator eq 'false';
  67.     open (my $FhResult_0, ">>", "$file.html" ) or die "Can't open per-line file $file: $!\n";
  68.    
  69.     shift @$row;
  70. print $FhResult_0 "<table>\n<tr><th>$file:</th></tr>\n";
  71. for my $i(map {clean($_)} @$row) {   
  72. if ($i){
  73. my $d = "<tr><td>$i</td></tr>\n";
  74. chomp $i;
  75.     print $FhResult_0 $d;
  76.  }
  77. }
  78.     print $FhResult_0 "</table>\n</body>\n</html>";
  79.     close $FhResult_0;
  80. }
  81. sub clean {   
  82.    my $string = shift;
  83.     $string =~ /\s*,\s*/;
  84.     $string =~ s/\s+$//;
  85.     return $string;
  86. }


Message édité par Henri772 le 24-08-2015 à 19:53:26

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  question

 

Sujets relatifs
Question naïve sur la programmationQuestion d'un débutant
Domoticz - Mise à jour d'un script (.cpp, .h) - Question de noob[RSA] Question sur les clés RSA
question xml[cakephp] Question de noob sur les models
Simple question ??Question programmation miniserveur/client FTP
Question à propos de Samba4Question sur la documentation
Plus de sujets relatifs à : question


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR