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

Lauvia
 2014-03-21 11:07
#174353 #174353
User since
2013-09-05
42 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,
ich bin gerade dabei einen Text zu parsen und möchte wissen, wie ich die Blockgrenzen fixieren kann.
in dem Code Beispiel habe ich den Flipflop Operator benutzt, ist aber sehr ungünstig, da der ausgegebene Block leider nicht alle gewünschten Zeile auffasst.

Anwendung: Skript <Folder(enthält test.txt)> <frame (Beispiel DT_PT_1)> <Output folder>

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#use strict;
use constant SCRIPT_NAME => "patch_mapping.pl";
use constant SCRIPT_VERSION => "1.0.1";
#use Log4TA


#Log_Info("USAGE: " . SCRIPT_NAME . <Frame Report Folder> <FRAME_NAME>,<FRAME_NAME>  [<output directory>]");

#Log_SetOutDir(".");
#Log_SetOutFile("log_patch_mapping.log");

my $ScrDIR = $ARGV[0]; 
my $FrameName = $ARGV[1];
my $out_dir = $ARGV[2];

my $frame;
my $emptyFrame;
my @added_frames;
my $Count = 0;
my $line;
my @array;

#-----Open source file------------------        
my $FrameReport = $ScrDIR."\\test.txt"; #Source document: Frame report list
my $fhR; 
open ($fhR, $FrameReport) or die "Unable to open the file $FrameReport\n"; 
#----------------------------------------

#-----add signal to mapping file--------
my $fhWrite = $out_dir."\\mapping".".txt";# Created document: mapping INCA Signal name - Internal signal name
open ($out_dir, '>>', $fhWrite) or die "Unable to open the file $fhWrite\n";
#----------------------------------------

# check for valid input parameter
if(! defined $FrameReport or ! -f $FrameReport)
{
    Log_Error("No frame report file given!");
    die;
}

if(!defined $FrameName)
{
    Log_Error("No frame name given!");
    die;
}
else
{
    #$FrameName =~ s/^frame=//i;
    #@added_frames = split("[\,\;]",$FrameName);
    @added_frames = split(/,/,$FrameName);
}

if(defined $out_dir)
{
    if(! -d $out_dir)
    {
        mkdir $out_dir;
    }
}
else
{
    $out_dir = ".";
}

#my $read_state;

#local $/ = q||;


while ($line = <$fhR>) #As long as the file fhR contains data, we read the data
{
        $Count++;
    foreach $frame(@added_frames)
    {           
        if($line=~ /$frame/ .. $line =~ /^$/)
        {
           print"my frame: $frame\n";
           print"my line: $Count\n";
                
           if($line =~ /::::0x/ and $line =~ /\_FA,/ and $line =~ /\(/) 
           {                            
                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"my total lines: $Count\n";       
}


wie gesagt mit dem Flipflop Operator im Beispiel wird für den ersten DT_PT_1-Block Zeilen 29 bis 33 aufgefasst. für den zweiten Block von 174 bis 179 (siehe bild) ich hätte es gern aber von 29 bis 58 und von 174 bis 190.

im Beispiel
Code (perl): (dl )
if($line=~ /$frame/ .. $line =~ /^$/)

wie kann ich die 2. Grenze (/^$/) setzen damit ich alles habe?

Danke für eure Hilfe
Anhänge
image/png
667 x 327
cmd.png
text/plain
359 lines
test.txt

Last edited: 2014-03-21 11:09:38 +0100 (CET)

View full thread Text blockweise parsen