![]() |
![]() |
7 Einträge, 1 Seite |
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
#/usr/bin/perl use strict 'vars'; { my @words; my $file_in; my $file_test; my @columns; my @datafile; my $line; my @koroesi; my %koroesi; my $currentline; $file_in = "svc_test_sdl.txt"; $file_test = "koroesi.txt"; open (INPUT, "$file_in") or die %!; open (TESTFILE, "$file_test") or die %!; @datafile = <INPUT>; close (INPUT); @koroesi = <TESTFILE>; close (TESTFILE); %koroesi = @koroesi; { foreach $line (@datafile){ chomp $line; (@columns) = split (/ /,$line); $currentline = $columns[1]; print "$currentline\n"; if (exists($koroesi{$currentline})) { s/$currentline/\[$currentline\]/; } } } }
$ perl skript.pl > ausgabe.txt
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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
#!/usr/bin/perl # vi: set ts=4 sw=4 sts=2 et: use strict; use warnings; # Author: linuxer # Date: 02. June 2008 # Description: # http://board.perl-community.de/thread/11962/#MSG0 my %verb; # 1st step: read all verbs into a hash { my $verb_file = 'koroesi.txt'; open my $fh, '<', $verb_file or die "$verb_file: open(ro) failed: $!\n"; # store all verbs in array; my @verbs = <$fh>; # remove all newlines chomp @verbs; # store all verbs as hash keys @verb{@verbs} = (); close $fh or die "$verb_file: close(ro) failed: $!\n"; } # 2nd step: do the work { my $check_file = 'svc_test_sdl.txt'; open my $fh, '<', $check_file or die "$check_file: open(ro) failed: $!\n"; while ( my $line = <$fh> ) { # split at whitespace (beware: newlines are whitespaces, so no chomp needed) my ( $noun, $verb, $number ) = split /\s+/, $line; # if $verb is defined, assume all variables are correctly filled if ( defined $verb ) { # is $verb a key in hash %verb? if ( exists $verb{$verb} ) { # print the modified data printf "%s [%s] %s\n", $noun, $verb, $number; # oder ohne printf #print $noun, " [$verb] ", $number, "\n"; } # if not else { # print unmodified line print $line; } } } close $fh or die "$check_file: close(ro) failed: $!\n"; } __END__
efbe+2008-06-02 20:19:06--Code (perl): (dl )use strict 'vars';
Quote
Quote
1 2
open INPUT, '<', $file_in or die $!; open TESTFILE, '<', $file_test or die $!;
QuoteCode (perl): (dl )%koroesi = @koroesi;
QuoteCode (perl): (dl )(@columns) = split (/ /,$line);
my @columns = split / /, $line;
efbe+2008-06-02 20:19:06--Hallo,
Mein Ansatz war bis jetzt der Folgende:
Zuerst die erste Datei in Spalten splitten... das funktioniert auch soweit.
Wenn ich dann allerdings nachsehen will ob das Wort in der 2. Datei vorkommt, gibt mir das Programm nichts mehr zurueck.
Meine Frage ist jetzt... was habe ich hier falschgemacht?
oder ist einfach mein kompletter Ansatz total bescheuert.
... in dem Fall... was waere ein guter Ansatz fuer mein Problem?
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 40 41 42 43#/usr/bin/perl use strict 'vars'; { my @words; my $file_in; my $file_test; my @columns; my @datafile; my $line; my @koroesi; my %koroesi; my $currentline; $file_in = "svc_test_sdl.txt"; $file_test = "koroesi.txt"; open (INPUT, "$file_in") or die %!; open (TESTFILE, "$file_test") or die %!; @datafile = <INPUT>; close (INPUT); @koroesi = <TESTFILE>; close (TESTFILE); %koroesi = @koroesi; { foreach $line (@datafile){ chomp $line; (@columns) = split (/ /,$line); $currentline = $columns[1]; print "$currentline\n"; if (exists($koroesi{$currentline})) { s/$currentline/\[$currentline\]/; } } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
:o( keine "warnings"
:o( warum "strict" auf 'vars' eingeschränkt
:o) (zeile 18/19) open auf misserfolg geprüft
verbesserung: 3-argument-open: open HANDLE, '<', $filename
:o( (zeile 26) %hash = @array; # boese
mit @array = ( 1,2,3,4 ) ergibt das %hash = ( 1=>2, 3=>4 );
:o( ausserdem stecken die Zeilenumbrüche noch in der Liste der Verben
:o| (zeile 37) wird nicht klappen, weil hier getestet wird,
ob das Verb ohne Umbruch als Hash-Key existiert... (s.o.)
:o( (zeile 39) s/// wird hier auf $_ angewendet, was aber nicht definiert
sein dürfte; die Zeile steckt in $line
:o| Die Maskierung der [] in der Ersetzung ist nicht notwendig
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 49 50 51 52 53
#!/usr/bin/perl use strict; use warnings; my $file_in = 'svc_test_sdl.txt'; my $file_out = 'svc_test_sdl.out.txt'; my $file_test = 'koroesi.txt'; my %koroesi; # Datei öffnen # (wenn es nicht geht enthält $! die Fehlermeldung) open(my $fh,'<',$file_test) or die "konnte $file_test nicht öffnen! ($!)\n"; # Datei zeilenweise einlesen while(my $verb=<$fh>) { # "\n" am ende entfernen, # wenn vorhanden chomp($verb); # Hash füllen $koroesi{$verb}=1; } close($fh); # Wenn man ein Array nimmt um alle Zeilen zu speichern, # dann verbraucht man auch eine menge Speicher. # Da ist es besser die datei Zeilenweise zu bearbeiten. # Eingabedatei öffnen open(my $fh_in,'<',$file_in) or die "konnte $file_in nicht öffnen! ($!)\n"; # Ausgebedatei öffnen open(my $fh_out,'>',$file_out) or die "konnte $file_out nicht öffnen! ($!)\n"; while(my $line=<$fh_in>) { chomp($line); # Zeile zerlegen my($noun, $verb, $number)=$line=~/^(.+?)\s+(.+?)\s+(.+?)$/; # so geht es natürlich auch: # my($noun, $verb, $number)=split(/\s+/,$zeile); # wenn das wort im Hash als Schlüssel existiert if(exists($koroesi{$verb})) { # dann neue Zeile erzeugen $line = "$noun [$verb] $number"; } # das ganze in die neue Datei schreiben print $fh_out $line."\n"; } # Ausgabedatei schließen close($fh_out); # Eingabedatei schließen close($fh_in);
QuoteIch halte es bei 170MB Daten nicht für sinnvoll die Ausgabe in die Konsole zu machen. Das direkte Zurückschreiben in eine Datei ist da sinnvoller.
![]() |
![]() |
7 Einträge, 1 Seite |