Dateiliste auslesen
Ralph Schuler
- perl
0 Ralph Schuler0 ortenau-s-bahner0 Rolf Rost0 Siechfred
Hallo ist irgendein Perl Spezialist da draussen, der mir weitherhelfen kann?
Folgende zwei Code-Ausschnitte illustrieren mein Problem:
chdir( "D:\verzeichnis\mit\textfiles\" );
local( @files ) = <*96961_B.dat>; ###### mit der direkten Bezeichnung funktioniert es.
foreach $file( @files ) { ###### hier werden z.B. 3 Files gefunden.
if( !-d $file ) {
print "$file<br>\n";
&extract; #Daten werden weiterverarbeitet
}
}
chdir( "D:\verzeichnis\mit\textfiles\" );
$adrnr = "96961";
$kategorie = "B";
$filename = join "","*","$adrnr","_","$kategorie",".dat";
local( @files ) = <$filename.>; ###### wenn der String mit join zusammengeführt wurde geht es nicht.
foreach $file( @files ) {
if( !-d $file ) {
print "$file<br>\n";
&extract; #Daten werden weiterverarbeitet
}
}
Hat jemand eine Idee, wie man im zweiten Ausschnitt das ganz mit Variablen hinkriegt? Besten Dank.
MfG
Ralph
Hallo ist irgendein Perl Spezialist da draussen, der mir weitherhelfen kann?
Folgende zwei Code-Ausschnitte illustrieren mein Problem:
chdir( "D:\verzeichnis\mit\textfiles\" );
local( @files ) = <*96961_B.dat>; ###### mit der direkten Bezeichnung funktioniert es.
foreach $file( @files ) { ###### hier werden z.B. 3 Files gefunden.
if( !-d $file ) {
print "$file<br>\n";
&extract; #Daten werden weiterverarbeitet
}
}chdir( "D:\verzeichnis\mit\textfiles\" );
$adrnr = "96961";
$kategorie = "B";
$filename = join "","*","$adrnr","_","$kategorie",".dat";local( @files ) = <$filename>; ###############natürlich muss hier der . nach $filename weg (Tippfehler) ###### wenn der String mit join zusammengeführt wurde geht es nicht.
foreach $file( @files ) {
if( !-d $file ) {
print "$file<br>\n";
&extract; #Daten werden weiterverarbeitet
}
}Hat jemand eine Idee, wie man im zweiten Ausschnitt das ganz mit Variablen hinkriegt? Besten Dank.
MfG
Ralph
Hi,
local( @files ) = <*96961_B.dat>
[...]
$adrnr = "96961";
$kategorie = "B";
$filename = join "","*","$adrnr","_","$kategorie",".dat";
open FILE, "<$filename" or die "Cant open File: $!";
@files=<FILE>;
close FILE;
HTH
ortenau-s-bahner
Hallo ortenau-s-bahner
Du scheinst meine Frage total falsch verstanden zu haben. Aber trotzdem danke!
Gruss
Ralph
Hi,
local( @files ) = <*96961_B.dat>
[...]
$adrnr = "96961";
$kategorie = "B";
$filename = join "","*","$adrnr","_","$kategorie",".dat";open FILE, "<$filename" or die "Cant open File: $!";
@files=<FILE>;
close FILE;HTH
ortenau-s-bahner
Mahlzeit;-)
Hallo ist irgendein Perl Spezialist da draussen, der mir weitherhelfen kann?
Na bei dem Sauwetter sitze ich eher drinnen...
Folgende zwei Code-Ausschnitte illustrieren mein Problem:
eben das Problem verstehe ich nicht ganz. Gehe da mal schrittweise vor, ersteinmal die Dateiliste erstellen, Verzeichnis auslesen, hier eine kleine Hilfestellung:
http://perlbase.xwolf.de/cgi-bin/perlbase.cgi?xbrowse=1
hmm, das kürzen wir mal ein bischen ab
opendir DIR, $dir or die $!;
my @files = grep{-f "$dir/$_"}readdir DIR; # siehe weiter unten...
closedir DIR;
zur Kontrolle die Liste mal ausgeben:
print join "\n", @files;
in grep {} kannst du also die Filter einbauen, die für deine Dateiliste interessant sind.
-f ist der Filetestoperator (sieh auch perlbase)
grep { not /^./ }readdir... zeigt alles außer die dirs . und ..
anstelle readdir geht natürlich auch globbing
my @files = <*.txt>;
aber Vorsicht, besser ists einen handler aufzumachen und readdir zu verwenden - da bist du sicher, dass du auch im richtigen Verzeichnis bist.
Tipp: Auch unter windows verwende den slash
my $dir = 'c:/tmp/'; # geht
Mahlzeit!
-- Rolf
Hallo Ralph.
Folgende zwei Code-Ausschnitte illustrieren mein Problem:
[...]
Was missfällt dir an File::Find?
#!usr/bin/perl -w
use strict;
use warnings;
use File::Find;
my @files;
my $muster = '.*96961_B.dat';
find(&bedingung, "verzeichnis/mit/textdateien");
sub bedingung {
if ( $_ =~ /^$muster$/ ) {
push(@files, $_);
}
return;
}
Siehe: http://www.perldoc.com/perl5.8.4/lib/File/Find.html
Freundschaft!
Siechfred
hallo Siechfried;
Was missfällt dir an File::Find?
huch, um ein Verzeichnis auszulesen brauchts doch kein Modul... aber wenn Untervezeichnisse mit einbezogen werdensollen, ist File::Find nicht schlecht.
Druschba!
Rolf
Hallo Rolf.
Was missfällt dir an File::Find?
huch, um ein Verzeichnis auszulesen brauchts doch kein Modul... aber wenn Untervezeichnisse mit einbezogen werdensollen, ist File::Find nicht schlecht.
Nun, vielleicht braucht es der OP doch, kommt halt auf das Drumherum an. Ansonsten gilt die alte Kosakenweisheit: Viele Wege führen nach Moskau. ;-)
Freundschaft!
Siechfred
Hallo Rolf, Hallo Siechfred
Es hat bestens geklappt mit der grep-Funktion. Obwohl ich grep eigentlich nur von Unix-Derivaten her kenne funzt es auch auf Win32. Besten Dank für eure Beiträge.
Gruss aus der Schweiz
Ralph