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
open (FILE, '<', 'Beispiel_Liste.txt') or die "$!"; open(OUT,"> Sortiert.txt") or die "Fehler beim Öffnen von 'Sortiert.d': $!\n"; while($_ = <FILE>) { if($_ =~ /Geburtuhrzeit [0-9].[0-9].*[0-9]*.*[0-9]*.*[0-9]*.*[0-9]*/) { my @zeile = split(/\s|\.|\//, $_); $year = $zeile[1]; $month = $zeile[2]; $day = $zeile[3]; $hour = $zeile[4]; $minute = $zeile[5]; $second = $zeile[6]; # print "$_"; if (($year == 1999) && ($month == 07) && ($day ==31)) { $gefunden = $.; print "Gefunden, die Zeilennummer ist $gefunden \n";# Kontrolle print $_; $startwert = $gefunden-1; #Namen übernehmen! } } if (($_ =~ /^$/)&&($gefunden))# Ab hier habe ich ein Problem, es soll zur nächste Blank-Line suchen und nicht den letzten Leerzeile! { $zeilennr=$.; print "empty line, $zeilennr \n"; foreach ($startwert; $startwert < $zeilennr ; $startwert ++) { print "Der Text wird uebernehmen. \n"; print OUT ($_); # Problem, die Zeile übernimmt er leider nicht in die Datei! print "$. $_\n"; # Kontrolle } } # Ende der while schleife }
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
*Verein DJK-Ort
Fabian
Geburtuhrzeit 2013.07.03.15.19.28
Gewicht...
HÖhe....
Seit...
Marion
Geburtuhrzeit 2013.07.03.15.20.26
Gewicht...
HÖhe....
Seit...
Hajo
Geburtuhrzeit 1999.07.31.21.29.53
Gewicht...
HÖhe....
Seit...
weitere Info..
Heino
Geburtuhrzeit 1999.07.31.21.30.36
Bekannt nur: Seit....
*ENDE
1
2
3
4
5
6
7
8
9
10
11
Ziel ist in der Datei Sortiert.txt:
Hajo
Geburtuhrzeit 1999.07.31.21.29.53
Gewicht...
HÖhe....
Seit...
weitere Info..
Heino
Geburtuhrzeit 1999.07.31.21.30.36
Bekannt nur: Seit....
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
use 5.14.0; use warnings; my @datensaetze = split /\n\n/, do { local $/; <DATA> }; say "$_\n" for grep /^Geburtuhrzeit 1999\.07\.31\.\d\d\.\d\d\.\d\d$/m, @datensaetze; __DATA__ Fabian Geburtuhrzeit 2013.07.03.15.19.28 Gewicht... HÖhe.... Seit... Marion Geburtuhrzeit 2013.07.03.15.20.26 Gewicht... HÖhe.... Seit... Hajo Geburtuhrzeit 1999.07.31.21.29.53 Gewicht... HÖhe.... Seit... weitere Info.. Heino Geburtuhrzeit 1999.07.31.21.30.36 Bekannt nur: Seit....
2015-04-29T17:49:19 orlando2016Code (perl): (dl )1 2 3 4open (FILE, '<', 'Beispiel_Liste.txt') or die "$!"; open(OUT,"> Sortiert.txt") or die "Fehler beim Öffnen von 'Sortiert.d': $!\n";
QuoteBenenne die Variable doch! z.B. $line = <$fh>Code (perl): (dl )while($_ = <FILE>)
Quote
QuoteDas kannst du einfacher haben:Code (perl): (dl )1 2 3 4 5 6 7 8 9{ my @zeile = split(/\s|\.|\//, $_); $year = $zeile[1]; $month = $zeile[2]; $day = $zeile[3]; $hour = $zeile[4]; $minute = $zeile[5]; $second = $zeile[6]; # print "$_";
QuoteAchtung: Zahlen mit führender 0 sind Oktal-Zahlen!Code (perl): (dl )if (($year == 1999) && ($month == 07) && ($day ==31))
QuoteCode (perl): (dl )foreach ($startwert; $startwert < $zeilennr ; $startwert ++)
my @datensaetze = do { local $/ = "\n\n"; <DATA> };
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 48
#!/usr/bin/perl use warnings; use strict; my $infile; my $outfile; my $i; my $u; open($infile, '<', 'Beispiel_Liste.txt') or die "$!"; my @a = <$infile>; close($infile); my @b = (); my %h; foreach $i (@a) { chomp($i); if ($i eq "") { if ($#b >= 1 && $b[1] =~ /Geburtuhrzeit/) { $h{$b[0]} = []; foreach $u (1 .. $#b) { push($h{$b[0]}, $b[$u]); } } @b = (); next; } push(@b, $i); } my @k = sort(keys(%h)); open($outfile, ">", "Sortiert.txt") or die "$!"; foreach $i (@k) { print "$i\n"; print $outfile "$i\n"; my @harr = @{$h{$i}}; foreach $u (@harr) { print "$u\n"; print $outfile "$u\n"; } print "\n"; print $outfile "\n"; } close($outfile);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
foreach $i (@a) { chomp($i); # chomp the trailing newline, It shows the linenumber if ($i eq "") # Search for empty line { print "Find empty line $. \n"; #Kontrolle funktioniert, ausser die Angaben der Zeilennummer if ($#b >= 1 && $b[1] =~ /Geburtuhrzeit [0-9].[0-9]/) { print "Find Geburtuhrzeit line $. \n"; # Kontrolle Funktioniert, ich möchte eine festes Datum suchen!, hier wäre zum Beispiel: Geburtuhrzeit 1999.07.31.21.29.53 $h{$b[0]} = []; foreach $u (1 .. $#b) # foreach (startwert..... $#array) { push ($h{$b[0]},($b[$u])); # push (ARRAY, newLIST), hat nicht geklappt! } } @b = (); next; } push(@b, $i); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
foreach $i (@a) { chomp($i); # chomp the trailing newline, It shows the linenumber if ($i =~ /Geburtuhrzeit [0-9].[0-9]/) { my (undef, $year, $month, $day) = split(/\s|\.|\//, $i); if (($year == 2010) && ($month == 07) && ($day ==31)) { chomp($i); print "$i\n"; print "$.\n"; print "Find Geburtuhrzeit with fixed date line $. \n"; #bis hierhin hat es funktioniert, dann geht er nicht in die Forschleife warum?? foreach $u (1 .. $#b) # foreach (startwert..... $#array) { if ($i eq "") { # Search for empty line next; print "Find empty line $. \n"; push ($h{$b[0]},($b[$u])); # push (ARRAY, newLIST)# Klappt nicht! } } }
2015-05-04T19:18:58 orlando2016Diese Zeile funktioniert es nicht.
Code (perl): (dl )push($h{$b[0]}, $b[$u]);
Es zeigt eine Fehlermeldung an. Sie lautet: Type of arg 1 to push must be array (not hash element) at Beispiel.pl line 24, near "])"
Woran konnte es gelegen haben?
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
*Verein DJK-Ort
Fabian
Geburtuhrzeit 2013.07.03.15.19.28
Gewicht...
HÖhe....
Seit...
Marion
Geburtuhrzeit 2013.07.03.15.20.26
Gewicht...
HÖhe....
Seit...
Hajo
Geburtuhrzeit 1999.07.31.21.29.53
Gewicht...
HÖhe....
Seit...
weitere Info..
Heino
Geburtuhrzeit 1999.07.31.21.30.36
Bekannt nur: Seit....
*ENDE
QuoteStarting with Perl 5.14, push can take a scalar EXPR, which must hold a reference to an unblessed array. The argument will be dereferenced automatically. This aspect of push is considered highly experimental. The exact behaviour may change in a future version of Perl.
2015-05-05T07:31:38 RaubtierHlubenow benutzt also ein hochexperimentelles Feature.
1 2 3 4
#!/usr/bin/python h = {"Klaus" : ["Geburtsdatum", "Beitritt"]} h["Klaus"].append("Sonstiges") print h["Klaus"]
2015-05-05T07:31:38 RaubtierEs bleibt immer noch offen, was Orlando eigentlich erreichen will.
Orlando# Ab hier habe ich ein Problem, es soll zur nächste Blank-Line suchen und nicht den letzten Leerzeile!
...
Ziel ist in der Datei Sortiert.txt:
Hajo
Geburtuhrzeit 1999.07.31.21.29.53
Gewicht...
HÖhe....
Seit...
weitere Info..
Heino
Geburtuhrzeit 1999.07.31.21.30.36
Bekannt nur: Seit....
2015-05-05T07:31:38 RaubtierDein Programm tut etwas anderes (was eigentich genau? In meinem Beispiel hat es den letzten Datensatz gelöscht und die anderen sortiert.)als meines oben (das Datensätze mit bestimmtem Datum heraussucht).
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
my $i; # für die äussere Schleife my $u; # für die innere Schleife open($infile, '<', 'herausfinden.d') or die "$!"; my @a = <$infile>; close($infile); my @b = (); #Leere Array my %h; # hier habe ich noch nicht ganz verstanden, was das Prozent bedeutet. Im Internet versuchte die Erklärung heraus zu finden... my $count = 0; # habe ich eingefügt, da ich sehen möchte, ob die Zeile richtig erkannt hat, und für mich erleichtert das Suchen im Beispiel_Liste.txt. Im Wirklichkeit ist die Datei viel länger... foreach $i (@a) # start der äussere Schleife, um die Datei jede Zeile einzulesen { chomp($i); # chomp the trailing newline, It shows the readline $count = $count + 1; #print "$count \n"; #dient als Kontrolle if ($i eq "") # Search for empty line { print "Find empty line $count \n"; #Kontrolle funktioniert #next; foreach $i (@a) #ab hier habe ich versucht mit dem festen Datum zu arbeiten, es hat auch funktioniert { if ($i =~ /Geburtuhrzeit [0-9].[0-9]/) { my (undef, $year, $month, $day) = split(/\s|\.|\//, $i); if (($year == 2010) && ($month == 07) && ($day ==31)) { print "Find Geburtuhrzeit with fixed date line $count $i \n"; next; # Ab hier kam ich nicht mehr weiter, da müsste ich noch weiter herum werkerln, vielleicht habt ihr einen Tipp... # if ($#b >= 1 && $b[1] =~ /Geburtuhrzeit [0-9].[0-9]/) # { # print "Find Geburtuhrzeit line $. \n"; # Kontrolle Funktioniert, ich möchte eine festes DAtum suchen! # $h{$b[0]} = []; # foreach $u (1 .. $#b) # foreach (startwert..... $#array) # { # push ($h{$b[0]},($b[$u])); # push (ARRAY, newLIST) # hat nicht geklappt! # } } @b = (); next; } }
2015-05-05T18:39:46 orlando2016Die Datensätze sollen Abschnitt mit "Geburtuhrzeit 1999.07.31.21.29.53" und dazugehörige Informationen in die Sortiert.txt gebracht werden. Die Uhrzeit ist unwichtig, entscheidend ist das Datum und Geburtuhrzeit. Das heisst im Beispiel_Liste.txt sind zwei Abschnitte mit Geburtuhrzeit 1999.07.31.21.29.53 enthalten.
2015-05-05T18:39:46 orlando2016Ich habe in dem Programm Kommentare geschrieben, ob ich auch richtig verstanden habe, was die Zeile alles bedeutet.