Schrift
[thread]8220[/thread]

perl: leerzeilen entfernen (Seite 9)

Leser: 13


<< |< 1 ... 6 7 8 9 10 11 12 >| >> 114 Einträge, 12 Seiten
sabrina
 2006-08-10 15:50
#68641 #68641
User since
2006-08-03
264 Artikel
BenutzerIn
[default_avatar]
@renee das kommt raus:

Code: (dl )
1
2
Mailbox                                             Last                                             Logged                                       << 
Gehring Sabrina Domainname\sa8bw <<

das ist meine original datei:
Code: (dl )
1
2
Mailbox    Last Logged on By    Size (KB)    Total Items    Last Logon Time    Last Logoff Time    
Gehring Sabrina Domainname\sa8bw 32 016 85 5.7.2006 16:36 5.7.2006 16:36


hier slit ich nach (\s)
ich benutz bei jedem code
Code: (dl )
1
2
3
 #!/usr/bin/perl -w
use warnings;
use strict;

@_daten da sind alle daten ausser die ueberschrift drin
sabrina
 2006-08-10 15:56
#68642 #68642
User since
2006-08-03
264 Artikel
BenutzerIn
[default_avatar]
bekomme keine fehler meldung!
es fehlen nur: size(KB) ,Total Items ,Last Logon Time ,Last Logoff Time
wenn ich nach (\s) split

warum ich @_daten in matrix uebergeb
damit @_daten (alle daten auser ueberschrift) mit @array(nur ueberschrift)
in einem array steht sonst bakamm ich immer nur die ueberschrift raus als ich nur @_daten hatte.
lg sabrina
renee
 2006-08-10 15:59
#68643 #68643
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=sabrina,10.08.2006, 13:50]@renee das kommt raus:

Code: (dl )
1
2
Mailbox                                             Last                                             Logged                                       << 
Gehring Sabrina Domainname\sa8bw <<

das ist meine original datei:
Code: (dl )
1
2
Mailbox    Last Logged on By    Size (KB)    Total Items    Last Logon Time    Last Logoff Time    
Gehring Sabrina Domainname\sa8bw 32 016 85 5.7.2006 16:36 5.7.2006 16:36


hier slit ich nach (\s)
ich benutz bei jedem code
Code: (dl )
1
2
3
 #!/usr/bin/perl -w
use warnings;
use strict;

@_daten da sind alle daten ausser die ueberschrift drin[/quote]
Da @_daten nie gefüllt wird und @matrix überschrieben wird, sind diese Sachen überflüssig.

Übernimm mal dieses Skript unverändert und teste mal, ob es den Anforderungen genügt:
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
#!/usr/bin/perl

use warnings;
use strict;

my @data;
my $file = 'mailbox.txt';

open(my $fh,'<',$file) or die $!;
while(my $line = <$fh>) { # alles was unten in __DATA__ steht symbolisiert eine Datei
chomp $line;
my @array = (split(/\s{2,}/,$line))[0..2];

foreach (@array) {
s%^\s+%%g; # fuehrende und
s%\s+$%%g; # abschliessende Blanks entfernen
} # foreach

push(@data,[@array]);
} # while
close $fh;


my $len_vorname = find_longest(map{$_->[0]}@data);
my $len_nachname = find_longest(map{$_->[1]}@data);
my $len_domain = find_longest(map{$_->[2]}@data);

for my $entry(@data){
print sprintf("%-*s %-*s %-*s<<\n",$len_vorname,$entry->[0],
$len_nachname,$entry->[1],
$len_domain,$entry->[2]);
}

sub find_longest{
my $longest = 0;
for(@_){
my $length = length($_);
$longest = $length if($length > $longest);
}

return $longest;
}


Wenn Du Tabulatoren und nicht mehrere Leerzeichen als Trenner hast, musst Du bei split das \s{2,} durch \t ersetzen.\n\n

<!--EDIT|renee|1155211278-->
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/
renee
 2006-08-10 16:13
#68644 #68644
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
So, damit das ganze auch generischer ist habe ich den Code etwas umgeschrieben:
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
#!/usr/bin/perl

use warnings;
use strict;

my @data;
my $file = 'mailbox.txt';
my $delimiter = '\s{2,}';
my $columns = 2;

open(my $fh,'<',$file) or die $!;
while(my $line = <$fh>) { # alles was unten in __DATA__ steht symbolisiert eine Datei
chomp $line;
my @array = (split(/$delimiter/,$line))[0..($columns-1)];

foreach (@array) {
s%^\s+%%g; # fuehrende und
s%\s+$%%g; # abschliessende Blanks entfernen
} # foreach

push(@data,[@array]);
} # while
close $fh;

my $format = '';

for my $i(0..scalar(@{$data[0]})-1){
my $max = find_longest(map{$_->[$i]}@data);
$format .= '%-'.$max.'s ';
}

for my $entry(@data){
print sprintf($format . "<<\n",@$entry);
}

sub find_longest{
my $longest = 0;
for(@_){
my $length = length($_);
$longest = $length if($length > $longest);
}

return $longest;
}


Jetzt hast Du alle Einstellmöglichkeiten am Anfang vom Skript. Bei $delimiter stellst Du ein, womit die einzelnen Felder getrennt sind. In diesem Falle \s{2,} (2 oder mehr Whitespaces). Wenn Dein Feldtrenner aber ein Tabulator ist, musst Du da nur \t eintragen. Und bei $columns legst Du fest, wie viele Felder haben möchtest. In diesem Fall nimmst Du einfach nur die ersten beiden (Bei Deinen Daten wären das 'Mailbox' und 'Last Logged on').
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/
sabrina
 2006-08-10 16:18
#68645 #68645
User since
2006-08-03
264 Artikel
BenutzerIn
[default_avatar]
@renee
funktioniert nicht es ist alles wieder verschoben!
er gibt mir aus:
Code: (dl )
1
2
3
Mailbox        Last Logged on By        Size (KB)        Total Items        Last Logon Time        Last Logoff Time                               <<
Gehring Sabrina Domainname\sa8bw 32 016 85 5.7.2006 16:36 5.7.2006 16:36<<
Gehring-Norak Marie Domainname\ma8bw 66 715 457 6.7.2006 6:31 <<

und er meckert "use of uninitialized value in length at untitled line 37 "
Code: (dl )
my $length = length($_);


lg sabrina
sabrina
 2006-08-10 16:21
#68646 #68646
User since
2006-08-03
264 Artikel
BenutzerIn
[default_avatar]
er meckert auch in line 29
Code: (dl )
1
2
3
 print sprintf("%-*s %-*s %-*s<<\n",$len_vorname,$entry->[0],
$len_nachname,$entry->[1],
$len_domain,$entry->[2]);
renee
 2006-08-10 16:43
#68647 #68647
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du solltest mal rausfinden, mit was die Felder getrennt sind und das dann bei $delimiter eintragen. Denn es sind definitiv keine Leerzeichen, sonst würde mein Code funktionieren. Generierst Du die Eingabedatei selbst? Wenn ja, wie sieht das aus?\n\n

<!--EDIT|renee|1155213893-->
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/
Ronnie
 2006-08-10 16:50
#68648 #68648
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Ginge es nicht auch ganz simple:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/perl

use strict;
use warnings;

my ($name, $logon, $size);

format STDOUT =
@<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<
$name, $logon, $size
.

while(<DATA>) {
next if $. == 1;
chomp;
($name, $logon, $size) = split /\s{2,}/;
write;
}

__DATA__
Mailbox Last Logged on By Size (KB) Total Items Last Logon Time Last Logoff Time
Gehring Sabrina Domainname\sa8bw 32 016 85 5.7.2006 16:36 5.7.2006 16:36
sabrina
 2006-08-10 16:54
#68649 #68649
User since
2006-08-03
264 Artikel
BenutzerIn
[default_avatar]
@RENEE
ichbehaupt jetzt einfach mal generieren sei ein anderes wort fuer :
fuellst Du die Eingabedatei selbst?

wenn das richtig ist nein die bekomme ich schon fertig.
genau genommen sind das mehrere und die sollen spaeter in eine zurueck gegeben werden.
muss aber erst mal die eine zum laufen bekommen.
wenn ich weis wie die felder getrennt werden meld ich mich wieder.
sabrina
 2006-08-10 17:11
#68650 #68650
User since
2006-08-03
264 Artikel
BenutzerIn
[default_avatar]
@ronnie
hast du das getestet, also bei mir gehts leider nicht
1. steht "@<<<<<<<<<" fuer die belegeten plaetze des arrays oder?
wenn ich das erste "@<<<<" verlaengere dann kommen alle daten wieder aber ich muss es lang genug fuer den laengsten datensatz machen.
sieht dann ungefahr so aus
@<<<<<<<<<<<<<<<<<<<<<<&
lt;<<<<<<<<<<<<<<<<<<<<<&lt
;<<
warum passiert nicht bei den anderen zwei hab erst gedacht das erste steht fuer namen das zweite fuer logon usw.
aber das erste steht fuer alles komisch?

2. auch hier bekomme ich meinen fehlercode  diesmal in line 12
Code: (dl )
1
2
 my @data;
open(DATA, "<msx-sg1.txt") or die "Datei nicht gefunden\n";

ich werd mal die leerstellen untersuchen
lg sabrina
<< |< 1 ... 6 7 8 9 10 11 12 >| >> 114 Einträge, 12 Seiten



View all threads created 2006-08-07 10:33.