繁体   English   中英

在一行中搜索特定的字符串,然后在PERL中搜索一个substr

[英]Search a specific string in lines and than do a substr at this point in PERL

我想在一行中搜索字符串。 找到此字符串后,我想在其中执行一个substr以获得ID。 这里举个例子。

字符串Testname Testfile 21345 Anfragekennziffer 4519349 Teststring

  • 因此,在这种情况下,我希望脚本捕获字符串“ Anfragekennziffer”并获取ID,在这里是: 4519349

到目前为止,我已经编写了一个脚本,可以让我获得ID,但前提是“ Anfragekennziffer”在一行的开头。 例如:

line 1 "Anfragekennziffer4586268" result: "4586268"
line 2 "Anfragekennziffer5686797" result: "5686797"

例如

输入文件可以具有以下内容:

da adad Anfragekennziffer 6797456
dadad  Anfragekennziffer6453914
dasdssss Anfragekennziffer6797433
dddsaaa Anfragekennziffer6609572
aaa Anfragekennziffer2435282
Anfragekennziffer 1234567
Anfragekennziffer21415666

我的脚本(见下文)将得到以下结果:

'nnziffer6','nziffer645','ennziffer6','nnziffer66','ffer243528','1234567','21415666'

因此,我希望脚本从“ Anfragekennziffer”开始,并获取我的ID-Anfragekennziffer位于该行中的npo问题。

到目前为止,这是我的代码:

#!/usr/bin/perl
use strict;
use warnings;
no warnings 'uninitialized';

my $Source = "Anfragekennziffer.txt";
my $SQL1 = "SQL_Confluence_Tabelle.txt";
my $SQL2 = "SQL_Provider_Antwort.txt";
my $time = localtime;

print "\n";
print "Local date and time: $time\n";
print "\n";
print "IDs wurden übertragen.\n";
print "Folgende SQL-Statements wurden erstellt:\n";
print "\n";
print "'SQL_Confluence_Tabelle'\n";
print "'SQL_Provider_Antwort'\n";
print "\n";

open(QUELLE, "$Source") or die "Open failed:$!";
open(ZIEL1, ">$SQL1") or die "Open failed:$!";
open(ZIEL2, ">$SQL2") or die "Open failed:$!";

my $ids;
my $weg;

while(my $row = <QUELLE>)
{
    if ($row =~m/Anfragekennziffer/)
    {
        $row=substr($row,17,10); #gebe nur IDs aus
        $row=~ s/^\s+|\s+$//g; #löscht Leerzeichen
        $ids=$ids."'".$row."',"; #kumuliere IDs
        $ids=~ s/\r|\n//g;
    }
}
$weg=chop($ids);

print ZIEL1 "$ids";

print ZIEL2 "$ids";
close(QUELLE); 
close(ZIEL1); 
close(ZIEL2);

如果有人有一个主意,那就太好了!

谢谢!

使用正则表达式查找匹配关键字Anfragekennziffer之后的数字是最简单的,该正则表达式也匹配该数字并捕获该数字:

my @ids;
while(my $row = <QUELLE>)
{
    if ($row =~ m/Anfragekennziffer\s*(\d+)/)
    {
        push @ids, $1;
    }
}
print join ",", @ids;

如果您对使用substr感到更舒适,那么index函数可以为您提供关键字在字符串中开始的位置,您可以尝试从中提取数字:

my @ids;
while(my $row = <QUELLE>)
{
    if (my $pos = index('Anfragekennziffer', $row))
    {
        push @ids, substr( $row, $pos + length('Anfragekennziffer'), 10 );
    }
}
print join ",", @ids;

这种方法比直接匹配数字的方法脆弱得多。

在这两种情况下,我都没有构建字符串,而是切换为在数组( @ids )中累积信息,然后使用join函数在最后打印该数组。 将列表保留为数组可以在以后要对数据做其他事情的情况下使代码保持灵活性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM