Thread Einlesen mehrerer Dateien
(38 answers)
Opened by Alex at 2013-04-23 11:08
Hi,
hier nochmal ein zweiter Ansatz (basiert auf meinem ersten, nur leicht abgewandelt). Hier wird ein Hash-of-Arrays befüllt. Der Hash-Key ist das Verzeichnis, in dem die Dateien gefunden wurden, der Value ist eine Array-Referenz mit den reinen Dateinamen. Anstatt der print-Anweisung (in der abschließende for-Schleife) wird nun eine Subroutine aufgerufen, die die Auswertung der Dateien beispielhaft vornehmen soll. 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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 #! /usr/bin/perl use strict; use warnings; # https://www.perl-community.de/bat/poard/thread/18288 use File::Find; # for searching for files/directories use File::Spec::Functions qw( catfile ); # for creating portable file-paths use Cwd; # for determing current work directory my @directories = ( cwd, # search in current work directory ); my %match; # storage for matching file paths sub combine_to { my $newfile = shift; my $directory = shift; my $filesRef = shift; my $outfile = catfile( $directory, $newfile ); open my $wh, '>', $outfile or die "open(w,$outfile) failed: $!\n"; for my $file ( @$filesRef ) { my $infile = catfile( $directory, $file ); open my $rh, '<', $infile or die "open(ro,$infile) failed: $!\n"; print $wh (<$rh>); close $rh; } close $wh or die "close($outfile) failed: $!\n"; } sub find_ffn_files { return if ! -d $File::Find::name; # skip if not a directory my $dir = $File::Find::name; # short name of directory opendir my $dh, $dir or die "Cannot open '$dir': $!\n"; # read '.ffn' files from directory and create full file path my @files = grep { m/\.ffn$/ } readdir $dh; closedir $dh; # create hash of array for matches; we must have found exactly 2 files $match{$dir} = \@files if 2 == @files; } # search for files and fill @matches find( \&find_ffn_files, @directories ); # check %match for my $dir ( keys %match ) { # combine found files into 'combined.ffn' in corresponding directory combine_to( 'combined.ffn', $dir => $match{$dir} ); } meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen! |