Thread Text blockweise parsen (9 answers)
Opened by Lauvia at 2014-03-21 11:07

Lauvia
 2014-03-24 10:31
#174384 #174384
User since
2013-09-05
42 Artikel
BenutzerIn
[default_avatar]
Hallo Renee,
vielen Dank für den Code!

wie wäre dann der reguläre Ausdruck um Frame Namen einzufangen?
ich konnte sie in einem anderen Skript mit
Code (perl): (dl )
($frame_name) = $line =~ /^FRAME\s+NAME:\s+.*?[\(|\[]([A-Z]+_[A-Z]+(?:[_ A-Z 0-9]+)?)[\)|\]|\,]/;

kopieren

so habe ich es gemacht:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my $file = 'test.txt';
my @added_frames;
my $line;

{
    open my $fh, '<', $file or die "$file: $!";

    # change block separator to have one complete frame
    # read per iteration
    local $/ = "\nFRAME NAME:";

    # read the blocks
    while ( my $frame = <$fh> ) {
        next if $. == 1;    # skip the "header"

        chomp $frame;       # remove block separator

        (my $frame_name) = $line =~ /\s+([A-Z]+_[A-Z]+(?:[_ A-Z 0-9]+)?)[\)|\]|\,]/;
                
        print"\nmy frame name: $frame_name\n\n";
                
        foreach $AddedFrame(@added_frames)
        {
            if($frame_name eq $AddedFrame)
            {
                if(($line =~ /::::0x/ and $line =~ /\(/) and ($line =~ /\_FA,/ or $line =~ /\_A,/)) 
                 {
                    if($line =~ /FREI/ or $line =~ /ID2\)/) #ignore lines with "FREI" or "(ID2)"
                    {}
                                                                                                        
                    else
                    {   
                       ( $_, $line) = split(/\(/,$line);         #selects string after the opened bracket
                       ( $_, $line) = split(/\)/,$line);                 #from the selected string, selects the one before the closed bracket
                                                                                                                
                        @array = split(/, /,$line);
                        print $out_dir  $_, ";", "$array[1]\n";
                        #$countPar = $countPar +1;                         #count the number of mapping <internal variables> to <INCA variables>
                    }
                }
            }
       }


        # print the frame
        print "This is a frame:\n",
              '=' x 30, "\n",
              $frame, "\n",
              '=' x 30;
    }
    close $fh;
}


Das Ziel wäre dann die in die Konsole eingegebenen Frame Namen (Bsp: DT_PT_1) in einzelnen Blöcken aussuchen. Wenn es macht, dann die Signale extrahieren. Kann sein, dass es 2x macht (DT_PT_1) eimal ohne ::::0x-Block und das 2.mal mit. Dann nur den Block mit ::::0x extrahieren.

View full thread Text blockweise parsen