Schrift
[thread]12352[/thread]

Zeilen einlesen und nach dritter Spalte sortieren (Seite 2)

Leser: 5


<< |< 1 2 3 4 5 >| >> 49 Einträge, 5 Seiten
leo11
 2008-08-16 11:01
#113567 #113567
User since
2008-08-14
250 Artikel
BenutzerIn
[default_avatar]
Guten Morgen,

ich hab mich nun an dem Vorschlag von LanX gewagt. Was haltet ihr von folgendem?

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
my @zeilen=();
open (FILE, '<', '/tmp/testdat.txt') or die "Fehler beim öffnen der Datei : $!";
while(<FILE>)
{
   print $_;
   /^([^;]*;){2}([^;]*)/;                                               #separate content of column three
   push (@zeilen, [$_,$2]);                                             #initialize ,2d array -> [0]=whole line, [1]content of column three
}
close (FILE);

my $first_line=shift(@zeilen);                                          #store first line

@zeilen=sort{$a->[1] <=> $b->[1]}@zeilen; #sort
unshift(@zeilen, $first_line);                                          #add first line

print "\n----------\n\n";

for my $zeile (@zeilen) {print $zeile->[0]}


VG
leo11
LanX-
 2008-08-16 14:07
#113570 #113570
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
genau, außer der regex, da müsste imho auch ein ( split ';' )[2] reichen (ungetestet mangels Perl)
betterworld
 2008-08-16 18:07
#113574 #113574
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Quote
Code: (dl )
1
2
    /^([^;]*;){2}([^;]*)/;
push (@zeilen, [$_,$2]);

Zu diesem regulären Ausdruck (abgesehen von LanX-s Kommentar):

Du solltest beachten, dass $2 von dem regulären Ausdruck nicht modifiziert wird, wenn er nicht matcht. In diesem Fall bedeutet es also, dass $2 noch auf einen Teil der vorherigen Zeile zeigt, wenn eine Zeile in der Datei falsches Format hat.
LanX-
 2008-08-16 20:18
#113575 #113575
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
Oh ja, hatten wir ja letztens, das man auf Matchvariablen nur zugreifen soll wenn's auch wirklich matcht. Oder man lässt die Matches auf ein Array links zuweisen.

Bestätigt meine Auffassung, dass man sich die RegEx-Kanone sparen sollte, wenn ein Builtin-Spatz reicht.

(schiefe Metapher die trotzdem trägt ;)
leo11
 2008-08-16 20:24
#113579 #113579
User since
2008-08-14
250 Artikel
BenutzerIn
[default_avatar]
@betterworld
Ich kann mich dunkel dran erinnern das auch mal in den Buch von Friedl gelesen zu haben... . Danke, habs geändert wie LanX es vorgeschlagen hat. Schade dass die Aufgabe damit erledigt ist.

Ich finde das ist ein gutes Forum. Ihr seid alle sehr freundlich hier.

VG
leo11
leo11
 2008-08-16 20:27
#113580 #113580
User since
2008-08-14
250 Artikel
BenutzerIn
[default_avatar]
Jetzt wo ich gerade den neuen Kommentar lese:

LanX-+2008-08-16 18:18:26--
Oh ja, hatten wir ja letztens, das man auf Matchvariablen nur zugreifen soll wenn's auch wirklich matcht. Oder man lässt die Matches auf ein Array links zuweisen.


Wie macht man das? Welcher Thread war das?
Dubu
 2008-08-16 20:33
#113581 #113581
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
betterworld
 2008-08-16 20:43
#113582 #113582
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
LanX-+2008-08-16 18:18:26--
Bestätigt meine Auffassung, dass man sich die RegEx-Kanone sparen sollte, wenn ein Builtin-Spatz reicht.


Wobei man sagen muss, dass auch split reguläre Ausdrücke benutzt. (OK, eine Haarspaltebene weiter wird Dein split natürlich optimiert, weil der reguläre Ausdruck ein fester String ist.) split ist eigentlich genau wie auch m// ein Builtin.

Daher würde ich der Klarheit zuliebe auch empfehlen, so zu schreiben:
Code: (dl )
1
2
3
4
split /;/

# statt:
split ";"


Das tut, so weit ich weiß, dasselbe... allerdings muss man aufpassen, denn split / / tut etwas anderes als split ' ' :) perldoc -f split
LanX-
 2008-08-16 21:16
#113585 #113585
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
leo11+2008-08-16 18:27:49--
Wie macht man das? Welcher Thread war das?

http://board.perl-community.de/thread/12248/startW...

Man kann sehr effizienten Code schreiben wenn man sich darauf verlässt das $1 NUR vom letzten ERFOLGREICHEN Match stammt, will man hingegen explizit sowas wie "leere Matches" (bei dir ja nicht der Fall) dann lieber so ein Konstrukt.

Code (perl): (dl )
@matches= ($text =~ m/pattern/)
LanX-
 2008-08-16 21:28
#113586 #113586
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
betterworld+2008-08-16 18:43:50--
Daher würde ich der Klarheit zuliebe auch empfehlen, so zu schreiben:
Code: (dl )
split /;/


du hast (leider) recht, denn sonst vergisst man eventuelle RegEx-Ausdrücke zu escapen

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
  DB<16> $_="a.b.c.d"


  DB<17> print join "_", split '\.'
a_b_c_d

  DB<18> print join "_", split '.'

  DB<19>
<< |< 1 2 3 4 5 >| >> 49 Einträge, 5 Seiten



View all threads created 2008-08-14 08:06.