|
|
|
|
Bonjour,
voila j'ai qq problemes pour recupérer des données d'un fichier avec perl,
le fichier source comprte 180 paragraphes similair (a part les chiffres bien sur :) ) à celui la :
| ELEMENT : 1 | HEXAEDRE | S-D : 3 | NOMBRE DE MOTS ASSOCIES : 27
NOMBRE DE NOEUDS : 8 : 1 4 6 2 55 56
57 58
REFERENCE DES FACES : 0 5 1 0 0 0
REFERENCE DES ARETES : 1 0 0 5 1 1
0 5 1 0 0 5
REFERENCE DES SOMMETS : 1 1 0 5 1 1
bon je dois recuperer le 3 et ca ne pose pas de probleme mais je veux recuperer les 8 elts du noeud c'est à dire 1 , 4 , 6 , 2 , 55 , 56 , 57 , 58 .
pour les six premiers c'est bon mais c'est pour le 57 et 58 qui posent probleme puisqu'il y a des espaces avant; bon CCM n'as pris en compte les espaces!
while( defined( $line = <FILE> ) )
{
@words = split( /\W+/, $line );
foreach $word (@words)
{
$word =~ tr/A-Z/a-z/;
if( $word =~ m/noeuds/ )
{
print "@words[5..10]\n";
}
}
}
merci a tous pour vitre aide
Salut,
#!/usr/bin/perl
use warnings;use strict;
while( defined (my $line = <DATA>) ) {
print "$1\n" if $line =~ /noeuds.*:(.*)/i;
}
__END__
| ELEMENT : 1 | HEXAEDRE | S-D : 3 | NOMBRE DE MOTS ASSOCIES : 27
NOMBRE DE NOEUDS : 8 : 1 4 6 2 55 56 57 58
REFERENCE DES FACES : 0 5 1 0 0 0
REFERENCE DES ARETES : 1 0 0 5 1 1 0 5 1 0 0 5
REFERENCE DES SOMMETS : 1 1 0 5 1 1
Ou encore#!/usr/bin/perl
use warnings;use strict;
while( <DATA> ) {
print "$1\n" if /noeuds.*:(.*)/i;
}
__END__
| ELEMENT : 1 | HEXAEDRE | S-D : 3 | NOMBRE DE MOTS ASSOCIES : 27
NOMBRE DE NOEUDS : 8 : 1 4 6 2 55 56 57 58
REFERENCE DES FACES : 0 5 1 0 0 0
REFERENCE DES ARETES : 1 0 0 5 1 1 0 5 1 0 0 5
REFERENCE DES SOMMETS : 1 1 0 5 1 1
lami20j |
Re,
|
Voila j'ai trouvé la solution , bon vu que je suis tt nouveau ds la programation peut etre il y aura des solutions plus simples. donc voila pr ceux qui veulent ma solution :
|
Salut,
lami20j@debian:~/trash$ cat leo25.txt | wc -l 16786176 lami20j@debian:~/trash$ du -h leo25.txt 843M leo25.txt lami20j@debian:~/trash$ time perl ccm_19092006.pl real 5m0.220s user 3m46.298s sys 0m15.441s lami20j@debian:~/trash$Le script #!/usr/bin/perl
open F_FILE,"leo25.txt" or die "E/S : $!";
open TEMP,">temp" or die "E/S : $!\n";
open LIRE,"temp" or die "E/S :$!\n";
open RES, ">res_leo" or die "E/S : $!\n";
open RES_LIRE, "res_leo" or die "E/S : $!\n";
open RES_ECRIRE,">final_res" or die "E/S : $!\n";
while( <F_FILE> ) {
s/\r\n/ / if /noeuds/i;
s/^\s*//;
print TEMP $_;
}
while (<LIRE>) {
next unless /element\b|noeuds/i;
s/\s+/ /g if /noeuds/i;
print RES " $1\n" if /noeuds.*:\s+(.*)/i;
my $idx = $1 if /S-D.*?(\d+)/;
print RES "$idx";
}
while (<RES_LIRE>) {
s/(\d+)\s+(.*)/$2 $1/;
print RES_ECRIRE $_;
}
unlink("temp");
unlink("res_leo"); Le résultat est dans le fichier final_res dans le répertoire courant.
lami20j |
Bon je suppose que tu l'as compris je voulais dire "j'ai pas compris grand chose :) " c'est le résultat qd on veut taper vite :) .
|
Salut,
#!/usr/bin/perl
open F_FILE,"leo25.txt" or die "E/S : $!";
open TEMP,">temp" or die "E/S : $!\n";
open LIRE,"temp" or die "E/S :$!\n";
open RES, ">res_leo" or die "E/S : $!\n";
while( <F_FILE> ){
s/\r?\n/ / if /noeuds/i;
s/^\s*//;
print TEMP $_;
}
while (<LIRE>) {
next unless /element\b|noeuds/i;
s/\s+/ /g if /noeuds/i;
print RES " $1\n" if /noeuds.*:\s+(.*)/i;
}
unlink("temp");Et le resultat 1 4 6 2 55 56 57 58 1 2 7 5 55 58 59 60 2 6 8 3 58 57 61 62 2 3 9 7 58 62 63 59 4 10 11 6 56 64 65 57 5 7 13 12 60 59 66 67 6 11 14 8 57 65 68 61 7 9 15 13 59 63 69 66 10 16 17 11 64 70 71 65 11 17 18 14 65 71 72 68 12 13 20 19 67 66 73 74 13 15 21 20 66 69 75 73 16 22 23 17 70 76 77 71 17 23 24 18 71 77 78 72 19 20 26 25 74 73 79 80 20 21 27 26 73 75 81 79 22 28 29 23 76 82 83 77 23 29 30 24 77 83 84 78 25 26 32 31 80 79 85 86 26 27 33 32 79 81 87 85 28 34 35 29 82 88 89 83 29 35 36 30 83 89 90 84 31 32 38 37 86 85 91 92 32 33 39 38 85 87 93 91 34 40 41 35 88 94 95 89 35 41 42 36 89 95 96 90 37 38 44 43 92 91 97 98 38 39 45 44 91 93 99 97 40 46 47 41 94 100 101 95 41 47 48 42 95 101 102 96 43 44 50 49 98 97 103 104 44 45 51 50 97 99 105 103 46 52 53 47 100 106 107 101 47 53 54 48 101 107 108 102 49 50 53 52 104 103 107 106 50 51 54 53 103 105 108 107 55 56 57 58 109 110 111 112 55 58 59 60 109 112 113 114 58 57 61 62 112 111 115 116 58 62 63 59 112 116 117 113 56 64 65 57 110 118 119 111 60 59 66 67 114 113 120 121 57 65 68 61 111 119 122 115 59 63 69 66 113 117 123 120 64 70 71 65 118 124 125 119 65 71 72 68 119 125 126 122 67 66 73 74 121 120 127 128 66 69 75 73 120 123 129 127 70 76 77 71 124 130 131 125 71 77 78 72 125 131 132 126 74 73 79 80 128 127 133 134 73 75 81 79 127 129 135 133 76 82 83 77 130 136 137 131 77 83 84 78 131 137 138 132 80 79 85 86 134 133 139 140 79 81 87 85 133 135 141 139 82 88 89 83 136 142 143 137 83 89 90 84 137 143 144 138 86 85 91 92 140 139 145 146 85 87 93 91 139 141 147 145 88 94 95 89 142 148 149 143 89 95 96 90 143 149 150 144 92 91 97 98 146 145 151 152 91 93 99 97 145 147 153 151 94 100 101 95 148 154 155 149 95 101 102 96 149 155 156 150 98 97 103 104 152 151 157 158 97 99 105 103 151 153 159 157 100 106 107 101 154 160 161 155 101 107 108 102 155 161 162 156 104 103 107 106 158 157 161 160 103 105 108 107 157 159 162 161 109 110 111 112 163 164 165 166 109 112 113 114 163 166 167 168 112 111 115 116 166 165 169 170 112 116 117 113 166 170 171 167 110 118 119 111 164 172 173 165 114 113 120 121 168 167 174 175 111 119 122 115 165 173 176 169 113 117 123 120 167 171 177 174 118 124 125 119 172 178 179 173 119 125 126 122 173 179 180 176 121 120 127 128 175 174 181 182 120 123 129 127 174 177 183 181 124 130 131 125 178 184 185 179 125 131 132 126 179 185 186 180 128 127 133 134 182 181 187 188 127 129 135 133 181 183 189 187 130 136 137 131 184 190 191 185 131 137 138 132 185 191 192 186 134 133 139 140 188 187 193 194 133 135 141 139 187 189 195 193 136 142 143 137 190 196 197 191 137 143 144 138 191 197 198 192 140 139 145 146 194 193 199 200 139 141 147 145 193 195 201 199 142 148 149 143 196 202 203 197 143 149 150 144 197 203 204 198 146 145 151 152 200 199 205 206 145 147 153 151 199 201 207 205 148 154 155 149 202 208 209 203 149 155 156 150 203 209 210 204 152 151 157 158 206 205 211 212 151 153 159 157 205 207 213 211 154 160 161 155 208 214 215 209 155 161 162 156 209 215 216 210 158 157 161 160 212 211 215 214 157 159 162 161 211 213 216 215 163 164 165 166 217 218 219 220 163 166 167 168 217 220 221 222 166 165 169 170 220 219 223 224 166 170 171 167 220 224 225 221 164 172 173 165 218 226 227 219 168 167 174 175 222 221 228 229 165 173 176 169 219 227 230 223 167 171 177 174 221 225 231 228 172 178 179 173 226 232 233 227 173 179 180 176 227 233 234 230 175 174 181 182 229 228 235 236 174 177 183 181 228 231 237 235 178 184 185 179 232 238 239 233 179 185 186 180 233 239 240 234 182 181 187 188 236 235 241 242 181 183 189 187 235 237 243 241 184 190 191 185 238 244 245 239 185 191 192 186 239 245 246 240 188 187 193 194 242 241 247 248 187 189 195 193 241 243 249 247 190 196 197 191 244 250 251 245 191 197 198 192 245 251 252 246 194 193 199 200 248 247 253 254 193 195 201 199 247 249 255 253 196 202 203 197 250 256 257 251 197 203 204 198 251 257 258 252 200 199 205 206 254 253 259 260 199 201 207 205 253 255 261 259 202 208 209 203 256 262 263 257 203 209 210 204 257 263 264 258 206 205 211 212 260 259 265 266 205 207 213 211 259 261 267 265 208 214 215 209 262 268 269 263 209 215 216 210 263 269 270 264 212 211 215 214 266 265 269 268 211 213 216 215 265 267 270 269 217 218 219 220 271 272 273 274 217 220 221 222 271 274 275 276 220 219 223 224 274 273 277 278 220 224 225 221 274 278 279 275 218 226 227 219 272 280 281 273 222 221 228 229 276 275 282 283 219 227 230 223 273 281 284 277 221 225 231 228 275 279 285 282 226 232 233 227 280 286 287 281 227 233 234 230 281 287 288 284 229 228 235 236 283 282 289 290 228 231 237 235 282 285 291 289 232 238 239 233 286 292 293 287 233 239 240 234 287 293 294 288 236 235 241 242 290 289 295 296 235 237 243 241 289 291 297 295 238 244 245 239 292 298 299 293 239 245 246 240 293 299 300 294 242 241 247 248 296 295 301 302 241 243 249 247 295 297 303 301 244 250 251 245 298 304 305 299 245 251 252 246 299 305 306 300 248 247 253 254 302 301 307 308 247 249 255 253 301 303 309 307 250 256 257 251 304 310 311 305 251 257 258 252 305 311 312 306 254 253 259 260 308 307 313 314 253 255 261 259 307 309 315 313 256 262 263 257 310 316 317 311 257 263 264 258 311 317 318 312 260 259 265 266 314 313 319 320lami20j P.S. Comme je t'ai déjà dit je l'ai testé sur le fichier que tu as mis sur cjoint.com Il ne faut pas jouer avec les fins de lignes. Dans ton fichier la fine de ligne est spécifique à Windows : Carriage Return + NewLine \r\n Si ça ne convient pas alors je ne sais plus quoi faire. J'ai testé chez moi et ça marche. peut être si on revient vers ma soluce et on l'améliore. c'est toi qui voit Ne le prends pas mal, mais sur les chaînes de caractères vaut mieux utiliser les regex que les tableaux, sauf si on n'a pas le choix. Mais ce n'est pas le cas de Perl. Tu dois apprendre TMTOWTDI There's More Than One Way To Do It Il y a plusieurs façon de le faire |
Voilà les commentaires pour le script (les lignes qui commence avec #)
#!/usr/bin/perl
# pour l'ouverture des fichiers je ne pense pas
# qu'il y a des problèmes
open F_FILE,"leo25.txt" or die "E/S : $!"; # ouverture en lecture
open TEMP,">temp" or die "E/S : $!\n";# ouverture en écriture
# d'un fichier temporaire
open LIRE,"temp" or die "E/S :$!\n"; # ouverture de fichier temporaire
# en lecture
open RES, ">res_leo" or die "E/S : $!\n";# ouverture de fichier
#resultat en écriture
while( <F_FILE> ){ # je lit le fichier d'origine ligne par ligne
s/\r?\n/ / if /noeuds/i; # si la ligne contient le mot NOEUDS
# j'enlève le caractère de fin de ligne
# dans ton fichiers les lignes se finissent avec
# Retour Chariot + Nouvelle Ligne
# s c'est l'operateur regex substitute (remplacer)
# s/\r\n/ / je remplace le caractère de fin de ligne
# avec un espace
# ce qui permet d'aligner les 2 nombres errants
s/^\s*//; # je supprime les espaces de début pour chaque ligne
# (pour l'affichage)
print TEMP $_; # j'écris dans le fichier temporaire
}
while (<LIRE>) { # je lit le fichier temporaire
next unless /noeuds/i; # je saute les lignes qui
# ne contient pas le mot noeuds
# le modificateur i c'est pour
# ne pas tenir compte
# de la casse de caractères
s/\s+/ /g if /noeuds/i; # je remplace les espaces
# qui separent les nombres
# avec un seul espace (pour affichage)
print RES " $1\n" if /noeuds.*:\s+(.*)/i; # j'écrit le resultat dans res_leo
}
unlink("temp"); # suppression de fichier temporairelami20j |
Merci lami20j;
|
il me donne ca comme résultats; 1 4 6 2 55 56 57 58 1 2 7 5 55 58 59 60 2 6 8 3 58 57 61 62 2 3 9 7 58 62 63 59 4 10 11 6 56 64 65 57 5 7 13 12 60 59 66 67Ce n'est pas comme ça que tu veux? Que veux tu obtenir comme résultat? Tu veux avoir le chiffre qui se trouve à côté de S-D : ?? TIMTOWTDI, c'est une devise des perliens Regarde ici http://www.linux-france.org/prj/jargonf/T/TMTOWTDI.html |
il me donne ca comme résultats; 1 4 6 2 55 56 57 58 1 2 7 5 55 58 59 60 2 6 8 3 58 57 61 62 2 3 9 7 58 62 63 59 4 10 11 6 56 64 65 57 5 7 13 12 60 59 66 67Ce n'est pas comme ça que tu veux? Que veux tu obtenir comme résultat? Tu veux comme ça? 1 4 6 2 55 56 57 58 3 1 2 7 5 55 58 59 60 1 2 6 8 3 58 57 61 62 3 2 3 9 7 58 62 63 59 3 4 10 11 6 56 64 65 57 3 5 7 13 12 60 59 66 67 3Si oui, prend le script de message 7 perl extraire des donnees d un fichier#7 Tu veux avoir le chiffre qui se trouve à côté de S-D : ?? TIMTOWTDI, c'est une devise des perliens Regarde ici www.linux-france.org/prj/jargonf/T/TMTOWTDI.html |
Merci lami20j pour cette aide mais pour l'instant je vais faire un mix de ce que j'ai fait et ce tu m'as proposé (probleme de temps) je vais m'y mettre aprés ce dead-line, je vais te soliciter encore une fois si tu veux bien.
|
Salut,
/E(?:-|+)\d+(\D)/$1/imais c'est à étudier lami20j |