Schrift
[thread]9071[/thread]

formatierte Datenausgabe (Seite 2)



<< |< 1 2 3 >| >> 28 Einträge, 3 Seiten
PerlProfi
 2007-06-07 14:55
#77321 #77321
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Mmh... also ich finde das irgendwie eindeutig. Aber warscheinlich hab ich noch was übersehen.
Jetzt mal ohne richtige Daten, Quelle:
Code: (dl )
1
2
3
Zeile1: 10, 20, 30, 40, 50
Zeile2: 20, 30, 40, 50, 60
Zeile3: 30, 40, 50, 60, 70

Ziel:
Code: (dl )
1
2
3
4
5
6
Spalte1 Spalte2 Spalte3
10 20 30
20 30 40
30 40 50
40 50 60
50 60 70


MfG
renee
 2007-06-07 16:12
#77322 #77322
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Norden,06.06.2007, 12:12]In jeder Zeile der Datei stehen sehr viele Werte, die ich über die for-Schleife ausgebe. Ist die for-Schleife beendet, wird die nächste Zeile der Datei eingelesen. Die Werte in dieser Zeile sollen dann aber in einer neuen Spalte ausgegeben werden, nicht unter den Werten der ersten Zeile.
Soll am Ende also so aussehen:

Spalte1 Spalte2 Spalte3 usw.
Werte 1.Zeile Werte 2.Zeile Werte 3.Zeile[/quote]
wohl eher nicht. Genau das ist das Problem was ich mit dieser Fragestellung habe. Der OP hat keine "Gesetzmäßigkeit" genannt von wo nach wo die Daten sollen...
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/
Norden
 2007-06-08 12:11
#77323 #77323
User since
2007-05-30
12 Artikel
BenutzerIn
[default_avatar]
Guten Morgen,
also erst mal vielen Dank für die vielen Antworten. Es ist genau so wie PerlProfi es in seinem Beispiel beschrieben hat. Wie kann man das denn realisieren? Über Arrays?? Dann bräucht ich ja ganz viele Arrays? Ich bin leider kein PerlProfi. Wär dankbar für Hilfe
renee
 2007-06-08 13:00
#77324 #77324
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Achso, dann hättest Du es genauer beschreiben müssen!

Statt der vielen Arrays, sollte man das besser ueber einen Hash realisieren.

Mal ein Beispielcode:
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
#!/usr/bin/perl

use strict;
use warnings;

my $file = 'input.txt';
my %hash;

open my $fh, '<', $file or die $!;
while( my $line = <$fh> ){
    chomp $line;
    my @zahlen = split /,/, $line;
    
    for my $i ( 0..$#zahlen ){
        push @{$hash{$i}}, $zahlen[$i];
    }
}
close $fh;


for my $j ( sort{ $a <=> $b }keys %hash ){
    print join("\t", @{ $hash{$j} }),"\n";
}
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/
sid burn
 2007-06-08 13:07
#77325 #77325
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Hmm, warum Hash?

zahlen.txt
Code: (dl )
1
2
3
10 20 30 40 50 60 70 80
20 30 40 50 60 70 80
30 40 50 60 70 80


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl
use strict;
use warnings;

my @output;
while ( my $line = <> ) {
my @zahlen = split /\s+/, $line;

my $row = 0;
for my $wert ( @zahlen ) {
push @{$output[$row++]}, $wert;
}
}

for my $row ( @output ) {
print "@$row\n";
}


Code: (dl )
1
2
3
4
5
6
7
8
9
sidburn@sid:~/perl$ ./zahlen.pl zahlen.txt
10 20 30
20 30 40
30 40 50
40 50 60
50 60 70
60 70 80
70 80
80
\n\n

<!--EDIT|sid burn|1181294149-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
renee
 2007-06-08 13:13
#77326 #77326
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
stimmt, hast recht. Ich hatte erst einen anderen Gedankengang und da ist der Hash noch übriggeblieben. Mit einem Array ist es natürlich besser!
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/
sid burn
 2007-06-08 13:27
#77327 #77327
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Hmm,
mein oberere Code Funktioniert aber nur dann einwandfrei, wenn es immer gleich viele Spalten, in der Quelldatei gibt. Hat man solch eine Datei
Code: (dl )
1
2
3
10 20 30 40 50 60
20 30 40 50 60 70 80
30 40 50 60 70 80 90 100


Bekommt man keine richtige Reihenfolge mehr raus. Dann muss man soetwas machen:

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 @output;
my $col = 0;
while ( my $line = <> ) {
my @zahlen = split /\s+/, $line;

my $row = 0;
for my $wert ( @zahlen ) {
$output[$row++][$col] = $wert;
}
$col++;
}

for my $row ( @output ) {
for my $wert ( @$row ) {
print $wert || 'N/A', ' ';
}
print "\n";
}


Code: (dl )
1
2
3
4
5
6
7
8
9
sidburn@sid:~/perl$ ./zahlen.pl zahlen.txt
10 20 30
20 30 40
30 40 50
40 50 60
50 60 70
60 70 80
N/A 80 90
N/A N/A 100


Wenn die Ausgabe übrigens nur für einen Benutzer veranschaulicht werden soll, und dann auch schön Tabellarisch, dann empfehle ich das Modul: Text::ASCIITable\n\n

<!--EDIT|sid burn|1181294921-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
topeg
 2007-06-08 14:27
#77328 #77328
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Ungetestet:
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
#!/usr/bin/perl
use strict;
use warnings;

my $filename_in='/pfad/datei.in';
my $filename_out='/pfad/datei.out';

my @MultFact=(); # ????????????

# zu lesende Datei
{
  local $/ = "\r\n";
  open(IN, '<', $filename_in) or die "$filename_in: $!";
  binmode(IN);
  my @in_liste=<IN>;
  close(IN);

 # Daten umwandeln
  for(my $c=0;$c<@in_liste;$c++)
  {
    my $l=$in_liste[$c];
    chomp($l);
    my @arr=unpack('C*',$_);
    map{ $_*=$MultFact[$c] }@arr;
    $in_liste[$c]=\@arr;
  }

  # Zeile<>Spalte tauschen
  my $out_liste=[];
  for(my $scount=0; $scount<@{$in_liste[0]]; $scount++)
  {
    for (my $lcount=0; $lcount<@in_liste; $lcount++)
    {
      $$out_liste[$scount]=[] if(ref($$out_liste[$scount]) ne 'ARRAY'); # ich weiß nicht nötig...
      $$out_liste[$scount][$lcount]=$liste[$lcount][$scount];
    }
  }

  # alles zusammenfügen:
  map{$_=join("\t",@$_)}@$out_liste;
  $out_liste=join("\n",@$out_liste);

  # Ergebnisse hier hineinschreiben
  open(OUT, '>>' ,$filename_out) or die "$filename_out: $!";
  print OUT $out_liste;
  close(OUT);
}
Norden
 2007-06-08 16:00
#77329 #77329
User since
2007-05-30
12 Artikel
BenutzerIn
[default_avatar]
Hallo vielen Dank,
hab es jetzt über einen Array wie von sid burn beschrieben gemacht, und das sieht auch schon mal ganz gut aus. Ergebnis:

2.4552 20.3400
2.3475 50.6000
4.4104 29.0100
12.2865 28.3000
0.0845 28.1500
3.9225 27.0200

Benutze dafür den Befehl "printf DATEI ("%.4f ", $wert);"
Kann ich das nun auch noch so formatieren, dass die Zahlen vor dem Komma so mit Leerzeichen aufgefüllt werden, dass alle korrekt untereinander angezeigt werden, also so:

2.4552 20.3400
2.3475 50.6000
4.4104 29.0100
12.2865 28.3000
0.0845 28.1500
3.9225 27.0200

Es sind maximal 3 Stellen vor dem Komma. Ich hab schon geguckt, aber ich glaub über den printf-Befehl geht das nicht?!
renee
 2007-06-08 16:13
#77330 #77330
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
einfach aus printf DATEI ("%.4f ", $wert); ein printf DATEI ("%.04f ", $wert); 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/
<< |< 1 2 3 >| >> 28 Einträge, 3 Seiten



View all threads created 2007-06-06 13:25.