Thread Text blockweise parsen
(9 answers)
Opened by Lauvia at 2014-03-21 11:07
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 Last edited: 2014-03-21 11:09:38 +0100 (CET) |