Ищите конкретную строку в строках, а затем делайте подстроку на этом этапе в PERL - PullRequest
0 голосов
/ 17 декабря 2018

Я хотел бы найти в строке строку.После того, как я нашел эту строку, я хочу сделать в ней подстрок, чтобы получить идентификатор.Вот пример.

String Testname Testfile 21345 Anfragekennziffer 4519349 Teststring

  • , поэтому в этом случае я бы хотел, чтобы скрипт перехватывал строку «Anfragekennziffer» и получал идентификатор, который находится здесь:4519349.

Я написал сценарий, который покажет мне идентификаторы, но только если Anfragekennziffer находится в начале строки.Например:

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

EG

Входной файл может иметь следующее содержимое:

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

Мой сценарий (см. Ниже) будет иметь следующий результат:

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

Итак, я хотел бы, чтобы скрипт запускался в "Anfragekennziffer" и получил мне ID - npo, где Anfragekennziffer находится в строке.

Вот мой код:

#!/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);

Было бы замечательно, если бы у кого-то была идея!

СПАСИБО!

1 Ответ

0 голосов
/ 17 декабря 2018

Поиск чисел после ключевого слова Anfragekennziffer проще всего сделать с помощью регулярного выражения, которое также соответствует номеру и фиксирует его:

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

Если вам удобнее использовать substr, тогда *Функция 1006 * 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 функция.Хранение списков в виде массивов помогает вашему коду оставаться гибким в случае, если вы захотите сделать что-то еще с данными позже.

...