2008-12-12 4 views
1

Я хочу, чтобы скрипт Perl извлекал данные из текстового файла и сохранял его как другой текстовый файл. Каждая строка текстового файла содержит URL-адрес в формате jpg, например «http://pics1.riyaj.com/thumbs/000/082/104//small.jpg». Я хочу, чтобы сценарий извлекал последние 6 номеров каждого URL jpg (например, 082104) для переменной. Я хочу, чтобы переменная была добавлена ​​в другое место в каждой строке нового текста.Как извлечь числовые данные из текстового файла?

Введите текст:

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

Выходной текст:

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

Благодаря

+0

Является ли их какой-либо конкретной проблемы, вы должны с написания его самостоятельно? Кроме того, всегда ли указаны URL-адреса формы, которую вы описали, или вам нужно иметь возможность обрабатывать произвольные URL-адреса? – mweerden 2008-12-12 07:37:54

ответ

2

Что вы пробовали до сих пор?

Вот короткая программа, которая дает мясо этой проблемы, и вы можете добавить остальное:

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

Это очень близко к программе командной строки ручки зацикливание и печати для вы с переключателем -p (см perlrun документации для деталей):

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

я не знаю, стоит ли отвечать согласно тому, что вы описали («последние 6 цифр») или просто предположить, что все это приспосабливает образец, который вы показали. Поэтому я решил ответить в обоих направлениях.

Вот метод, который может обрабатывать линии, более разнообразные, чем ваши примеры.

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(); 

Однако, если это так же регулярно, как вы показываете, это становится намного проще:

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(); 
Смежные вопросы