2008-12-12 5 views
1

Je veux que le script Perl extrait une donnée d'un fichier texte et l'enregistre comme un autre fichier texte. Chaque ligne du fichier texte contient une URL vers un fichier jpg comme "http://pics1.riyaj.com/thumbs/000/082/104//small.jpg". Je veux que le script extrait les 6 derniers chiffres de chaque URL jpg (ie 082104) dans une variable. Je veux que la variable soit ajoutée à un emplacement différent sur chaque ligne du nouveau texte.Comment puis-je extraire des données numériques à partir d'un fichier texte?

texte d'entrée:

text http://pics1.riyaj.com/thumbs/000/082/104/small.jpg text 
text http://pics1.riyaj.com/thumbs/000/569/315/small.jpg text 

texte de sortie:

text php?id=82104 text 
text php?id=569315 text 

Merci

+0

est leur problème spécifique que vous avez avec vous l'écrire? En outre, les URL sont-elles toujours du formulaire que vous avez décrit ou devez-vous gérer des URL arbitraires? – mweerden

Répondre

2

Qu'avez-vous essayé jusqu'à présent?

Voici un court programme qui vous donne la viande du problème, et vous pouvez ajouter le reste:

 
while() 
    { 
    s|http://.*/\d+/(\d+)/(\d+).*?jpg|php?id=$1$2|; 
    print; 
    } 

Ceci est très proche du programme de ligne de commande les poignées de la mise en boucle et d'impression pour vous avec le commutateur -p (voir la documentation perlrun pour les détails):

perl -pi.old -e 's|http://.*/\d+/(\d+)/(\d+).*?jpg|php?id=$1$2|' inputfile > outputfile 
1

Je ne savais pas si la réponse en fonction de ce que vous avez décrit (« 6 derniers chiffres ») ou tout simplement supposer que tout correspond à la modèle que vous avez montré. J'ai donc décidé de répondre dans les deux sens.

Voici une méthode qui peut gérer des lignes plus diverses que vos exemples.

use FileHandle; 

my $jpeg_RE = qr{ 
    (.*?)   # Anything, watching out for patterns ahead 
    \s+    # At least one space 
    (?> http://) # Once we match "http://" we're onto the next section 
    \S*?   # Any non-space, watching out for what follows 
    ((?: \d+ /)* # At least one digit, followed by a slash, any number of times 
     \d+   # another group of digits 
    )    # end group 
    \D*?   # Any number of non-digits looking ahead 
    \.jpg   # literal string '.jpg' 
    \s+    # At least one space 
    (.*)    # The rest of the line 
}x; 

my $infile = FileHandle->new("<$file_in"); 
my $outfile = FileHandle->new(">$file_out"); 

while (my $line = <$infile>) { 
    my ($pre_text, $digits, $post_text) = ($line =~ m/$jpeg_RE/); 
    $digits  =~ s/\D//g; 
    $outfile->printf("$pre_text php?id=%s $post_text\n", substr($digits, -6)); 
} 
$infile->close(); 

Cependant, si elle est tout aussi régulière que vous montrer, il devient beaucoup plus facile:

use FileHandle; 
my $jpeg_RE = qr{ 
    (?> \Qhttp://pics1.riyaj.com/thumbs/\E) 
    \d{3} 
    /
    (\d{3}) 
    /
    (\d{3}) 
    \S*? 
    \.jpg 
}x; 

my $infile = FileHandle->new("<$file_in"); 
my $outfile = FileHandle->new(">$file_out"); 

while (my $line = <$infile>) { 
    $line =~ s/$jpeg_RE/php?id=$1$2/g; 
    $outfile->print($line); 
} 
$infile->close(); 
Questions connexes