perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 19
Click for quality!




12.02.2012 / 03:44

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragWer kann mir bei diesem Skript weiterhelfen ..
Seitenanfang
hi leute,
ich habe mal ein skript gebastelt und komme jetzt nicht mehr weiter. ich möchte eine adressdatei anlegen und danach diese nach bestimmten feldern sortieren. wie mache ich das? anbei der code bisher!!
es wäre nett,wenn mir jemand weiterhelfen könnte!!

danke


!/usr/bin/perl
use warnings;
use strict;
my($Eingabe);
my(@AdressListe);
my($AdressBuch)="maddins2.txt";
do{
open (DATEI, ">>maddins2.txt") or die "Fehler beim öffnen der Datei\n$!";
print "Bitte geben Sie Vorname, Nachname, Straße, Postleitzahl, Ort und Geburtstag, getrennt durch Kommata, ein:\n";
$Eingabe = <STDIN>;
chomp $Eingabe;
@AdressListe = split(/,/, $Eingabe);
for(@AdressListe){
print DATEI $_;
}
print DATEI "\n";
}until($Eingabe eq "fin");
close(DATEI);
print "Datei geschlossen\n";
#20
#-------------------------------------------------------------------------------#-------------------------------------------------------------------------------
#sortieren
open (LIST, "<maddins2.txt") or die "Kann die Datei $AdressBuch nicht öffnen: $!";
seek(LIST, 0, 0);

#daten lesen
my @daten = <LIST>;
my ($daten, $records, $name, $vorname, $plz, $ort, $geb);
my (@records);

#sort
foreach my $record (sort{rec($a) cmp rec ($b)} @daten) { push (@records, $record);}

#daten verarbeiten
foreach $daten (@records) {
chmop $daten;
($name, $vorname, $plz, $ort, $geb) = split/\|/, $daten;
print "Nach was möchten Sie sortieren?"

}

#implementation Funktion rec
sub rec{

#Sortierfeld bestimmen
my ($sortieren, $record);
($name, $vorname, $plz, $ort, $geb) = split/\|/, $record;

#ausgewähltes Feld zurück geben
if ($sortieren == 1){
return $name;
}
elsif ($sortieren == 2){
return $vorname;
}
elsif ($sortieren == 3){
return $plz;
}
elsif ($sortieren == 4){
return $ort;
}
elsif ($sortieren == 5){
return $geb;
}
else{
print "Falsche Eingabe\n";
}
}

Datum: 19.01.2006-11:20

Beitragre: Wer kann mir bei diesem Skript weiterhelfen ..
Seitenanfang
Was Du brauchst ist sowas: http://www.unix.org.ua/orelly/perl/cookbook/ch04_16.htm

Lies Deine Daten in ein AoH (Array of Hashes), dann sortiere das Array nach einem beliebigen Feld in den Hashes.

Gruss,
Sven

Datum: 19.01.2006-12:21

Beitragre: Wer kann mir bei diesem Skript weiterhelfen ..
Seitenanfang
könntest du mir vieleicht ein kurzes bsp geben, da ich noch blutiger anfänger bin? danke

Datum: 19.01.2006-14:34

Beitragre: Wer kann mir bei diesem Skript weiterhelfen ..
Seitenanfang
Hi,

Kommentare im Code...


use strict;
#use Data::Dumper; # um eventuall die Datenstruktur anzuschauen

# unser Addressen Array
my @addressen;

# einlesen (bei Dir vorher open(...)
while (<DATA>) {
chomp; # newline entfernen
my %datensatz; # ein Datensatz-Hash
my @daten = split(/,/, $_); # gelesene Zeile splitten
$datensatz{'Vorname'} = $daten[0]; #dem Hash zuweisen
$datensatz{'Nachname'} = $daten[1];
$datensatz{'Strasse'} = $daten[2];
$datensatz{'PLZ'} = $daten[3];
$datensatz{'Ort'} = $daten[4];
push(@addressen, { %datensatz }); # den Hash in das Array zuweisen
}

#print Dumper(\@addressen); # damit kann man gut die Datenstruktur sehen

# ein Beispiel fr Sortierung nach Nachname:
my $sortfield = 'Nachname';

# jetzt die "Schwartzian Transformation", sie ist gut in dem Artikel erklrt, den ich bereits gepostet habe
@addressen = map { $_->[1] }
sort { $a->[0] cmp $b->[0] }
map { [ $_->{$sortfield}, $_ ] }
@addressen;

# Ausgabe der sortierten Datenstze
foreach my $addresse (@addressen) {
print $addresse->{'Vorname'} . ","
. $addresse->{'Nachname'} . ","
. $addresse->{'Strasse'} . ","
. $addresse->{'PLZ'} . ","
. $addresse->{'Ort'} . "\n";
}

__DATA__
Sven,Nachname,MeineStrasse 25,69120,Heidelberg
Erik,Wikinger,SeineStrasse 13,54379,Trondheim
Winnetou,Apache,Am Wigwam 1,10945,Mexico City

Gruss,
Sven

Datum: 19.01.2006-15:38

Beitragre: Wer kann mir bei diesem Skript weiterhelfen ..
Seitenanfang
hi svenXY,
vielen Dank für Deine mühen. Jetzt ist mir die funktionsweise auch klar.
Aber kann das sein, dass du mit einlesen meine ausgüsse gemeint hast?

gruß villiboy

Datum: 19.01.2006-17:01

Beitragre: Wer kann mir bei diesem Skript weiterhelfen ..
Seitenanfang
Hi,

Ausgüsse? Versteh ich nicht.

Was Du ja machen willst ist erst dem User anbieten, einen Datensatz einzugeben, den schreibst Du in Deine Datei und schliesst sie wieder.
Dann öffnest Du sie wieder und liest alle Datensätze ein, um sie dann zu sortieren. Das meinte ich mit einlesen.

Man kann in Perl auch aus dem Handle <DATA> lesen und Perl wird am Ende der Datei nach Text suchen, der unterhalb von __DATA__ steht. Das ist praktisch für Beispiele mit Einlesen von Text, da man "echte" Daten verarbeiten kann, ohne ein weiteres File zu brauchen. Deshalb schreibe ich "while (<DATA>)...", während Du erst ein "open(IN, "<$infile")..." und dann erst "while (<IN>)..." schreiben musst.

Gruss,
Sven

Datum: 20.01.2006-09:58

-






-
-