Thread Einlesen mehrerer Dateien (38 answers)
Opened by Alex at 2013-04-23 11:08

Linuxer
 2013-04-29 21:00
#167355 #167355
User since
2006-01-27
3870 Artikel
HausmeisterIn

user image
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!

View full thread Einlesen mehrerer Dateien