Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6475[/thread]

.txt Datei sortieren



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
scooby
 2004-08-09 13:50
#85593 #85593
User since
2004-08-09
5 Artikel
BenutzerIn
[default_avatar]
Hallo!

Habe folgendes Prob!

Ich muss ein Perl Script schreiben welches eine .txt Datei sortiert! Da ich totaler Anfänger bin wäre es schön wenn mir da jmd. helfen könnte!

Die Datei sieht so aus!

bla bla bla; bla bla bla.(hier ROTbla0000 bla 0.0.0.0 bla bla
bla bla bla.
bla bla bla; bla bla bla.(hier VIObla0000 bla 0.0.0.0 bla bla
bla bla bla.

Die Ausgabe soll so aussehen!

Hier alle Ausgaben die ROT sind:
...

Hier alle Ausgaben die VIO sind:
...


Es soll also nach ROT und VIO sortiert werden!

Hat da jmd. einen Ansatz für mich!

Danke im Voraus!
Crian
 2004-08-09 14:00
#85594 #85594
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Hallo scooby,

herzlich willkommen im Forum!

Möchtest Du nur die Zeilen, in denen ROT oder VIO vorkommt? Oder alle Zeilen? Und wie genau soll die Sortierung aussehen?


Edit: Passt die Datei erwartungsgemäß jetzt (und in Zukunft) in den Speicher?

Benutzt Du ein unixoides Betriebssystem?\n\n

<!--EDIT|Crian|1092045723-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
scooby
 2004-08-09 14:43
#85595 #85595
User since
2004-08-09
5 Artikel
BenutzerIn
[default_avatar]
Die Ausgabe soll die Zeile in der z.B. ROT steht + die darauffolgende Zeile enthalten.
Das Script soll den Inhalt der Datei so sortieren das erst alle ROT dann alle VIO usw. ausgegeben werden!


Betriebssystem ist win2000!
Speicher ist kein Problem!\n\n

<!--EDIT|scooby|1092048429-->
Crian
 2004-08-09 14:47
#85596 #85596
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Du sprachst zuerst von Sortierung. Dabei gehen eigentlich keine Zeilen verloren. Jetzt sprichst Du von etwas wie Ausschneiden, Du möchtest also die Zeilen mit ROT und deren Folgezeilen haben, die anderen Zeilen nicht?! Sollen diese ausgegebenen Zeilen dann noch irgendwie sortiert werden?

Entschuldige das "dumme" Nachgefrage, aber mir ist Dein Problem einfach noch nicht ganz klar. =)


Trotzdem versuche ich Dir mal einen Ansatz zu geben, an dem können wir dann ja noch arbeiten:

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

my $lastline = '';
while (<>) {
   if (m~ROT~ or $lastline =~ m~ROT~) {
      print;
   }
   $lastline = $_;
}


(ungetestet)\n\n

<!--EDIT|Crian|1092048734-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
[E|B]
 2004-08-09 14:57
#85597 #85597
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Hallo scooby und auch von mir ein herzliches Willkommen!
Wie Crain schon sagte, ist die Angabe der Datei oben etwas verwirrend. Meinst du vielleicht so:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/perl
use strict;
use warnings;

open(F, "file.txt") or die $!;
my @file = <F>;
close(F);

@file = sort{$a cmp $b} @file;
print @file;
\n\n

<!--EDIT|[E|B]|1092049044-->
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
Montyk
 2004-08-09 15:01
#85598 #85598
User since
2004-08-04
1 Artikel
BenutzerIn
[default_avatar]
Hi !

Wenn ein String sortiert werden soll, versuchs mal so:

Code: (dl )
1
2
3
my @array = ("A", "B", "Z", "F", "c", "H", "8");

print join(' ', sort { $a cmp $b } @array), "\n";


Die Ausgabe: 8 A B F H Z c (Weil Nummern vor Großschrift und Groß- vor Kleinschrift)

Falls Du nur numerisch sortieren möchtest "cmp" gegen <=> austauschen, bei absteigener Sortierung $a und $b vertauschen.

In diesem Sinne ...

Gruß
Montyk
Wenn alle Menschen normal wären,
wie langweilig würd dann die Welt sein !
Crian
 2004-08-09 16:06
#85599 #85599
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
@Montyk: auch Dir ein herzliches Willkommen. Allerdings ist Deine Antwort wohl nicht die Lösung des Problems ;)

Mein Algorithmus von oben lässt sich noch beschleunigen, denn dort teste ich jede Zeile zwei Mal.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/perl
use strict;
use warnings;

my $lastmatch = 0;
while (<>) {
my $match = m~ROT~;
print if $match or $lastmatch;
  $lastmatch = $match;
}
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
scooby
 2004-08-09 16:08
#85600 #85600
User since
2004-08-09
5 Artikel
BenutzerIn
[default_avatar]
[quote=Crian,09.08.2004, 12:47]Du sprachst zuerst von Sortierung. Dabei gehen eigentlich keine Zeilen verloren. Jetzt sprichst Du von etwas wie Ausschneiden, Du möchtest also die Zeilen mit ROT und deren Folgezeilen haben, die anderen Zeilen nicht?! Sollen diese ausgegebenen Zeilen dann noch irgendwie sortiert werden?

Entschuldige das "dumme" Nachgefrage, aber mir ist Dein Problem einfach noch nicht ganz klar. =)


Trotzdem versuche ich Dir mal einen Ansatz zu geben, an dem können wir dann ja noch arbeiten:

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

my $lastline = '';
while (<>) {
   if (m~ROT~ or $lastline =~ m~ROT~) {
      print;
   }
   $lastline = $_;
}


(ungetestet)[/quote]
es soll nichts ausgeschnitten werden!

Die Datei soll einfach einfach nur sortiert werden!

Die Ausgabe soll dann einfach so aussehen das nacheinander alle Einträge mit ROT ausgegeben werden (2 Zeilen) dann alle mit VIO usw.

Die Ausgabedatei soll also so aussehen!


Ausgabe ROT:

"Hier kommen alle Ausgaben (eine Ausgabe hat 2 Zeilen) rein die ROT enthalten!"


Ausgabe VIO:

"Hier kommen alle Ausgaben (eine Ausgabe hat 2 Zeilen) rein die VIO enthalten!"\n\n

<!--EDIT|scooby|1092053626-->
Crian
 2004-08-09 16:17
#85601 #85601
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Deine Aussagen sind widersprüchlich.

Entweder willst Du nichts verlieren, oder Du willst nur die Zeilen mit ROT und die folgende Zeile.

Poste bitte mal konkret eine kurze Eingabedatei und die Ausgabedatei, die daraus erzeugt werden soll.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
scooby
 2004-08-09 16:55
#85602 #85602
User since
2004-08-09
5 Artikel
BenutzerIn
[default_avatar]
[quote=Crian,09.08.2004, 12:47]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl
use strict;
use warnings;

my $lastline = '';
while (<>) {
   if (m~ROT~ or $lastline =~ m~ROT~) {
      print;
   }
   $lastline = $_;
}


(ungetestet)[/quote]
Dieser Code von dir Crian ist genau das was ich möchte!

Die gleiche Ausgabe soll jetzt auch noch darunter mit VIO kommen. Damit wäre die Datei ja nach ROT und VIO sortiert.

Ich würde die Ausgabe gerne in einer neuen .txt Datei speichern. Weiss leider nur nicht genau wo das "open" und "print" hinkommt?
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2004-08-09 13:50.