Schrift
[thread]12352[/thread]

Zeilen einlesen und nach dritter Spalte sortieren (Seite 3)

Leser: 5


<< |< 1 2 3 4 5 >| >> 49 Einträge, 5 Seiten
leo11
 2008-08-24 11:04
#113936 #113936
User since
2008-08-14
250 Artikel
BenutzerIn
[default_avatar]
Hallo,

es ist mal wieder We und ich versuch ein bißchen in Perl weiter zu kommen. Daher hab ich mir als Ziel gesetzt die hier angesprochene Aufgabe etwas abzuändern. Die zu sortierende Datei sieht wie folgt aus:

Zeile1;;100;;
Zeile2;;60;;
Zeile3;;20;;
Zeile4;;20;;
Zeile5;;40;;
....
Zeile n

Ich lese sie wie folgt in ein Array ein:
Code (perl): (dl )
1
2
3
4
while(<FILE>)
{
         push (@zeilen, [$_,( split /;/ )[3]]);                                 
}

Nun möchte ich alle Zeilen bei denen in der dritten Spalte eine 20 steht aus @zeilen herausnehmen und in ein neues array speichern. Ich habe dafür mit splice experimentiert, aber ich bin nicht auf die konkrete Lösung gekommen. Ich finde die Infos in perldoc -f splice auch recht kurz. auf folgende Art habe ich es versucht:
Code (perl): (dl )
1
2
3
4
5
6
for my $zeile1 (@zeilen) {
        if ( $zeile1->[1] =~ m/20/) {
                #print $zeile1->[0];
                @zweierlevel=splice(@zeilen,$_,1);
        };
};

Ich habe auch Kombis mit grep probiert. Erfolglos. Würde mir jemand einfach mal zeigen wie man das macht?

-----------
Als nächstes möchte ich alle Zeilen bis zur 20 aus @zeilen nehmen und in ein extra Array zu speichern. Wie kann man das machen?
LanX-
 2008-08-24 15:09
#113943 #113943
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
das
leo11+2008-08-24 09:04:28--
Code (perl): (dl )
1
2
3
4
while(<FILE>)
{
         push (@zeilen, [$_,( split /;/ )[3]]);                                 
}


war eine Hilfskonstruktion um das Sortieren zu vereinfachen, wenn du da noch mehr machen wilst rate ich dir aber davon ab, das ist unnötig komplex, dann bleib lieber bei einem simplen ArrayOfArrays mit den Split-Feldern inder 2. Ebene.

leo11+2008-08-24 09:04:28--
Nun möchte ich alle Zeilen bei denen in der dritten Spalte eine 20 steht aus @zeilen herausnehmen und in ein neues array speichern.


Bitte konkreter, willst du einen Auszug und die Originalliste soll erhalten bleiben, oder willst du die Originalliste per Filter verkürzen, oder beides?
Ronnie
 2008-08-24 15:53
#113944 #113944
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
leo11+2008-08-24 09:04:28--
Würde mir jemand einfach mal zeigen wie man das macht?

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

use strict;
use warnings;

use Data::Dumper;

my @rows = map {chomp; $_} (<DATA>);
print Dumper \@rows;

my @filtered = grep { $_->[2] == 20 } map { [split /;/, $_] } @rows;
print Dumper \@filtered;

__DATA__
Zeile1;;100;;
Zeile2;;60;;
Zeile3;;20;;
Zeile4;;20;;
Zeile5;;40;;

leo11+2008-08-24 09:04:28--
Als nächstes möchte ich alle Zeilen bis zur 20 aus @zeilen nehmen und in ein extra Array zu speichern. Wie kann man das machen?

Code: (dl )
1
2
3
4
5
6
my @first_ones;
for my $row (@rows) {
last if [split /;/, $row]->[2] == 20;
push @first_ones, $row;
}
print Dumper \@first_ones;
LanX-
 2008-08-24 15:55
#113945 #113945
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
Um bei dem Code zu bleiben
leo11+2008-08-24 09:04:28--
Code (perl): (dl )
1
2
3
4
while(<FILE>)
{
         push (@zeilen, [$_,( split /;/ )[3]]);                                 
}


ungetestet:
Code (perl): (dl )
1
2
@auszug = grep { $_->[1] == 20} @zeilen;
@verkuerzt = grep { $_->[1] !=  20} @zeilen;
leo11
 2008-08-24 16:07
#113946 #113946
User since
2008-08-14
250 Artikel
BenutzerIn
[default_avatar]
Hi LanX.
Ich möchte 2 Dinge lernen:
1.) Ich habe eine Datei mit folgendem Inhalt
Zeile1;;100;;
Zeile2;;60;;
Zeile3;;20;;
Zeile4;;20;;
Zeile5;;40;;
...
Zeile n

Alle Zeilen die in der dritten Spalte KEINE 20 haben sollen in Array a, die 20er in Array b. Woebei nicht davon ausgegangen werden kann, dass die 20er immer in Zeile 3 und 4 stehen.
---------------------------------------------------------------------------------
2.)Ich habe gelernt das von oben angefangen Zeile für Zeile eingelesen wird. Nun möchte ich als Ergebnis ein Array a, das alle Zeilen enthält, bis in der dritten Spalte 20 steht. Dann ein Array b, das die 20er Zeilen enthält, und ein Array c, dass die restlichen Zeilen bis zu Dateiende enthält.
leo11
 2008-08-24 16:11
#113947 #113947
User since
2008-08-14
250 Artikel
BenutzerIn
[default_avatar]
In der Zeit wo ich meinen Beitrag getippt hab, habt ihr eine Lösung präsentiert. (-:
Schau ich mir gleich mal an.
Ronnie
 2008-08-24 16:28
#113948 #113948
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
leo11+2008-08-24 14:07:40--
Nun möchte ich als Ergebnis ein Array a, das alle Zeilen enthält, bis in der dritten Spalte 20 steht. Dann ein Array b, das die 20er Zeilen enthält, und ein Array c, dass die restlichen Zeilen bis zu Dateiende enthält.

Je konkreter deine erste Problembeschreibung ist und je detailierter du beschreibst was du schon probiert hast, sowie wie deine Eingangsdaten aussehen und wie die Ausgangsdaten aussehen sollen, desto leichter ist es für uns dir gezielt zu helfen!
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
#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my @rows = map {chomp; $_} (<DATA>);
print Dumper in_three_chunks(\@rows, 20);

sub in_three_chunks {
    my $rows = shift;
    my $criteria = shift;
    
    return unless ref $rows or not $criteria =~ /^\d+$/;
    
    my %parted = ( before => [], matching => [], after => [] );
    
    for my $row (@$rows) {
        my $cur = [split /;/, $row];
        
        push @{$parted{'matching'}}, $cur and next if $cur->[2] == $criteria;
        
        unless (@{$parted{'matching'}}) {
            push @{$parted{'before'}}, $cur;
        } else {
            push @{$parted{'after'}}, $cur;
        }
    }
    
    return \%parted;
}

__DATA__
Zeile1;;100;;
Zeile2;;60;;
Zeile3;;20;;
Zeile4;;20;;
Zeile5;;40;;
LanX-
 2008-08-24 17:16
#113950 #113950
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
leo11+2008-08-24 14:07:40--
2.)Ich habe gelernt das von oben angefangen Zeile für Zeile eingelesen wird. Nun möchte ich als Ergebnis ein Array a, das alle Zeilen enthält, bis in der dritten Spalte 20 steht. Dann ein Array b, das die 20er Zeilen enthält, und ein Array c, dass die restlichen Zeilen bis zu Dateiende enthält.


@leo: das ist *sehr* missverständlich formuliert, was heißt "bis" und "ab"? Input-Reihenfolge oder aufsteigend sortiert?
leo11
 2008-08-24 18:53
#113951 #113951
User since
2008-08-14
250 Artikel
BenutzerIn
[default_avatar]
@LanX
Danke für deine Nachfrage. Ich will mir erstmal weiter den Quellcode von Ronnie anschauen. Da stecken so viel Ideen drin... . Ich brauch die Zeit.
LanX-
 2008-08-24 19:39
#113952 #113952
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
@leo: Wer weiß ob Ronnies Ideen deine Ideen sind ...
<< |< 1 2 3 4 5 >| >> 49 Einträge, 5 Seiten



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