Schrift
[thread]7884[/thread]

letzten Zeilen im Array wiederholen



<< |< 1 2 >| >> 16 Einträge, 2 Seiten
EagleFox
 2006-04-12 18:11
#64790 #64790
User since
2006-04-10
66 Artikel
BenutzerIn
[default_avatar]
Ich brauche nochmal Eure Hilfe.

Mit folgendem code sortiere ich Daten:

Code: (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
sub getDatensatz{
my ($entry) = @_;
my $bool = 0;
my $warte_auf_flanke = 0;
my $set = '';
my @fallend;
for my $line(split(/\r?\n/,$entry)){
chomp $line;
my $wert = (split(/\s+/,$line))[-1];

if($wert > 4.8)
{
$warte_auf_flanke = 1;
}
if($warte_auf_flanke and $wert < 4)
{
$warte_auf_flanke = 0;
$bool = 1;
}

unless($bool){
push(@fallend,$line);
}
else{
$set .= $line."\n";
}
}
$set .= $_."\n" for(@fallend);
$set .= "\n\n";
return $set;
}


Es werden hier die Zeilen in einem Datenblock "abgeschnitten" und nach vorne an den Block gehängt, sobald der letzte Wert der Zeile wieder auf <4 sinkt, nachdem er mal 4.8 überschritten hatte.
Nun möchte ich es realisieren, dass die letzte Zeile des Datenblocks genau noch zehn mal wiederholt wird, bevor die abgeschnittenen Daten vorne angehängt werden.

Also:

vorher

a a a 0
b b b 2
c c c 4
d d d 5
e e e 5
f f f 4
g g g 3
h h h 1
i i i 0

nachher:

g g g 3
h h h 1
i i i 0
i i i 0
i i i 0
i i i 0
i i i 0
i i i 0
i i i 0
i i i 0
i i i 0
i i i 0
i i i 0
a a a 0
b b b 2
c c c 4
d d d 5
e e e 5
f f f 4

Ich hoffe das ist so verständlich.
renee
 2006-04-12 19:34
#64791 #64791
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das könntest Du mit splice (<!--perldoc_f1--><a href="http://faq.perl-community.de/bin/view/Perldoc/perl..." target="_blank"><img alt="perldoc " src="/iB_html/non-cgi/Skin/SKIN-3/images/perldoc.gif" border="0"> <!--perldoc_f2-->-f splice<!--perldoc_f3--></a><!--perldoc_f4-->) machen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
EagleFox
 2006-04-12 21:18
#64792 #64792
User since
2006-04-10
66 Artikel
BenutzerIn
[default_avatar]
Hmmm, dieses Topic existiert noch nicht.

Ich google mal nach. Danke erst mal.
renee
 2006-04-12 23:31
#64793 #64793
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Kannst Du auch einfach in der Kommandozeile eingeben:perldoc -f splice
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
EagleFox
 2006-04-13 13:19
#64794 #64794
User since
2006-04-10
66 Artikel
BenutzerIn
[default_avatar]
Hi Renee,

splice habe ich (fast) verstanden.
Ich habe das dann so realisiert:

Code: (dl )
1
2
3
4
for (my $i=0;$i<10;$i++)
{
push(@fallend,$fallend[-1]);
}


weil ich ja als "List"-Parameter noch irgendwie eine Liste mit 10 mal dem letzten Eintrag erstellen müsste, was wahrscheinlich auch nicht anders funktioniert hätte.

Aber ich glaube ich stehe da vor einem ganz anderen Problem. Und zwar ist es so, dass ab einem bestimmten Punkt die Daten in das Array gelesen werden bis der Datenblock abgefrühstückt ist und dann wird vom Anfang des Blocks der Rest ins Array gelesen. Nach meinem Programm oben wird dann leider der letzte Punkt vor Beginn des Arrays 10 mal wieder holt.

Also zum Beispiel oben passiert das hier:

g g g 3
h h h 1
i i i 0
a a a 0
b b b 2
c c c 4
d d d 5
e e e 5
f f f 4
f f f 4
f f f 4
f f f 4
f f f 4
f f f 4
f f f 4
f f f 4
f f f 4
f f f 4

Ich möchte aber, dass der letzte Punkt des ursprünglichen Datensatzes 10 mal wiederholt wird, bevor er zum Anfang des Datenblocks geht und den Rest einliest. Wie mach ich dem Programm das denn klar?
EagleFox
 2006-04-13 15:34
#64795 #64795
User since
2006-04-10
66 Artikel
BenutzerIn
[default_avatar]
Ich hätte ne Idee:

Meine Datenblöcke sind durch jeweils zwei Leerzeilen getrennt. Wie kann ich einfach nach zwei Leerzeilen suchen und dann die letzte Zeile davor in einer Variablen speichern?
Taulmarill
 2006-04-13 15:56
#64796 #64796
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
wenn wir uns dein programm anschauen, dann sehen wir, dass du im endeffekt nach der for-schleife die letzte zeile, die in der variable $set drin steht, noch 9 mal an $set anhängen musst, um zu dem von dir gewünschten ergebniss zu kommen. das führt mich zu folgender lösung:
Code: (dl )
1
2
3
4
5
my $last = ( split /\n/, $set )[-1];
$set .= ( $last . "\n" ) x 9;
$set .= $_ . "\n" for (@fallend);
$set .= "\n\n";
return $set;

ich hoffe der ansatz ist klar.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
EagleFox
 2006-04-13 16:17
#64797 #64797
User since
2006-04-10
66 Artikel
BenutzerIn
[default_avatar]
Jetzt kommen wir der Sache schon viiiiiiel näher!

Aber ganz getroffen haben wir es noch nicht. Jetzt sieht das Ergebnis so aus:

g g g 3
h h h 1
i i i 0
i i i 0
i i i 0
i i i 0
i i i 0
i i i 0
i i i 0
i i i 0
i i i 0
i i i 0
i i i 0
a a a 0
b b b 2
c c c 4
d d d 5
e e e 5
f f f 4
g g g 3
h h h 1
i i i 0

und dann noch sieben mal der komplette Datenblock:

a a a 0
b b b 2
c c c 4
d d d 5
e e e 5
f f f 4
g g g 3
h h h 1
i i i 0

Aber Du bist auf dem richtigen Weg! Ich hoffe Du hast noch ne Idee!
Taulmarill
 2006-04-13 17:00
#64798 #64798
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
hm, irgendwo hast du da was falsch übernommen. ich bekomme folgende ausgabe
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
g g g 3
h h h 1
i i i 0
i i i 0
i i i 0
i i i 0
i i i 0
i i i 0
i i i 0
i i i 0
i i i 0
i i i 0
a a a 0
b b b 2
c c c 4
d d d 5
e e e 5
f f f 4

wenn das nicht die gewünschte ausgabe ist, dann beschreibe bitte genauer, was falsch ist. wenn du eine andere ausgabe bekommst, dann poste am besten noch einmal den kompletten code deiner sub, damit wir den fehler finden können.

den kompletten Block noch einmal anzuhängen sollte doch für dich kein problem sein.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
EagleFox
 2006-04-13 17:08
#64799 #64799
User since
2006-04-10
66 Artikel
BenutzerIn
[default_avatar]
Ja, genau so soll das aussehen!

Aber ich habe gerade gemerkt, dass ich wohl durch die ganze Herumprobiererei irgendetwas im Code geändert haben muss, was mir jetzt alles durcheinander bringt! Hier mal der komplette code:

Code: (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
#! /usr/bin/perl

use strict;
use warnings;

print $ARGV[0];

my $file = $ARGV[0];
my ($in,$suffix) = $ARGV[0] =~ /(.*?)(\.[^\.]+)$/;
my $out = $in.'.cut'.$suffix;

my $count_ = 1;
my $datensatz = '';

{
open(my $outfh,">$out") or die $!;

open(my $fh,"<$file") or die $!;
while(my $entry = <$fh>){
$entry =~ s/\r?\n//g;
if($entry =~ /^\s*?#/){
print $outfh $entry,"\n";
}
else{
if($entry =~ /^\s*?$/){
$count_++;
}
else{
$datensatz .= $entry."\n";
}
if($count_ % 3 == 0){
$datensatz = getDatensatz($datensatz);
print $outfh $datensatz;
$count_ = 1;
$datensatz = '';
}
}
}
if($datensatz){
$datensatz = getDatensatz($datensatz);
print $outfh $datensatz;
}
close $fh;
close $outfh;
}


sub getDatensatz{
my ($entry) = @_;
my $bool = 0;
my $warte_auf_flanke = 0;
my $set = '';
my @fallend;
for my $line(split(/\r?\n/,$entry)){
chomp $line;
my $wert = (split(/\s+/,$line))[-1];

if($wert > 4.8)
{
$warte_auf_flanke = 1;
}
if($warte_auf_flanke and $wert < 4)
{
$warte_auf_flanke = 0;
$bool = 1;
}

unless($bool){
push(@fallend,$_[-1]);
}
else{
$set .= $line."\n";
}
}


my $last = ( split /\n/, $set )[-1];
$set .= ( $last . "\n" ) x 9;
$set .= $_ . "\n" for (@fallend);
$set .= "\n\n";
return $set;

}


Ich finde den Fehler nicht! ;-(
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2006-04-12 18:11.