English 中文(简体)
我如何从文本文件中提取数字数据?
原标题:
  • 时间:2008-12-12 06:22:43
  •  标签:

我想用Perl脚本从文本文件中提取数据,并将其保存为另一个文本文件。文本文件的每一行都包含一个指向JPG的URL,例如 "http://pics1.riyaj.com/thumbs/000/082/104//small.jpg"。我希望脚本提取每个JPG URL的最后6个数字(即082104)到一个变量中。我希望将变量添加到新文本的每一行的不同位置。

Sorry, there is no text provided to be translated. Please provide the text you would like to have translated.

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 

谢谢 (Xièxiè)

问题回答

你到目前为止尝试了什么?

这里是一个简短的程序,它给你问题的核心部分,你可以添加其余部分:

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

我不知道按照你所描述的(“最后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
", 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();




相关问题
热门标签