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

Linuxer
 2013-04-30 15:07
#167362 #167362
User since
2006-01-27
3871 Artikel
HausmeisterIn

user image
Du lieferst sehr wenig Informationen, daher kann man schwer etwas zu Deinem "Fehler" sagen.

Wenn Du konkreter würdest, wo Dir der Code unklar ist, kann ich Dir auch Details nachliefern....

Mein Code von gestern 21:00 macht folgendes:

  • er ermittelt das aktuelle Verzeichnis
  • in diesem Verzeichnis und den Unterverzeichnissen sucht er nach .ffn Dateien
  • findet er genau zwei in einem Verzeichnis, übernimmt er den Verzeichnisnamen und die Dateinamen
  • findet er nur eine Datei oder mehr als zwei, ignoriert er diese Funde
    (wenn nur eine Datei da ist, war der Gedanke: wozu die Arbeit?)
  • für die gefundenen Dateien ruft er die combine_to()-Routine auf
  • diese bekommt den zu erstellenden Dateinamen, das Fund-Verzeichnis und die Dateinamen übergeben


Bei meinem Test daheim hat dieser Code funktioniert.
Da ich nicht weiß, wie der von Dir ausgeführte Code aussieht (mein Original oder eine modifizierte Variante), ist nur schwer was zum "Fehler" zu sagen. Auch verlierst Du kein Wort darüber, wo Du das Skript ausgeführt hast. Bist Du ins Verzeichnis gewechselt, wo die Dateien liegen?

Zunächst sollte sichergestellt sein, dass ein Code überhaupt Dateien findet, die er verarbeiten würde.
Also nochmal überarbeitet; wichtige Änderungen:

  • das Datenverzeichnis muss nun explizit angegeben werden; Skript anpassen!
  • Funde mit einer oder zwei Dateien werden jetzt gesammelt
  • Keine Verarbeitung, nur Kontrollausgabe durch combine_to()


(edit: konnte jetzt allerdings nicht testen...)

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
#! /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 = (                         # where do you want to search?
    '/path/to/data/dir',                    # herein are the .ffn files; ADJUST THIS PATH
);

my %match;                                  # storage for matching file paths


# this routine is to be changed to do the job of data extraction and combination
# ADJUST THIS CODE if test run was successful
sub combine_to {

    my $newfile   = shift;
    my $directory = shift;
    my $filesRef  = shift;

    # DEBUG output
    warn <<DEBUGTEXT;
DATADIR: '$directory'
OUTPUTFILE: '$newfile'
DATAFILES: @{$filesRef}

DEBUGTEXT

}


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 1 or exactly 2 files
    $match{$dir} = \@files      if @files && 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} );

}

Last edited: 2013-04-30 15:19:57 +0200 (CEST)
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