Ralph Schuler: Dateiliste auslesen

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

  1. 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

  2. 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

    --
    ss:} zu:$ ls:} fo:| de:] va:) ch:? sh:( n4:# rl:? br:> js:| ie:( fl:{ mo:)
    1. 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

  3. 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

    --
    KnowHow veröffentlichen statt Patentieren!
  4. 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");

    die gesuchten Dateien stehen in @files

    und können weiterverarbeitet werden

    sub bedingung {
      if ( $_ =~ /^$muster$/ ) {
        push(@files, $_);
      }
      return;
    }

    Siehe: http://www.perldoc.com/perl5.8.4/lib/File/Find.html

    Freundschaft!
    Siechfred

    1. 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

      --
      KnowHow veröffentlichen statt Patentieren!
      1. 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

        1. 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