Schrift
[thread]7621[/thread]

datein in verzeichnis durchlaufen

Leser: 1


<< |< 1 2 >| >> 18 Einträge, 2 Seiten
Gast Gast
 2006-01-14 21:03
#61900 #61900
hi,

wollte mal fragen was die beste und einfachste methode ist, wenn ich mit einem script den inhalt aller datein(txt) in einem verzeichnis durchsuchen will.

also mit anderen worten: wenn ich jede im verzeichnis einmal mit while ($line = <IN>) durchlaufen will, wie bekomme ich dann nacheinander alle datein im verzeichnis in IN?

max
renee
 2006-01-14 21:23
#61901 #61901
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
perldoc -f opendir
perldoc -f readdir
perldoc -f closedir


Code: (dl )
1
2
3
4
5
6
7
opendir(DIR,$verzeichnis) or die $!;
my @files = grep{-f $verzeichnis.'/'.$_}readdir(DIR);
closedir DIR;

for my $file(@files){
# durchsuchen
}


Fuer das Durchsuchen wuerde ich vielleicht CPAN:Tie::File und grep benutzen oder CPAN:File::Slurp...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
jameshetfield321
 2006-01-14 21:55
#61902 #61902
User since
2006-01-14
1 Artikel
BenutzerIn
[default_avatar]
ok, vielen dank erstmal. soweit läuft es. nur was muss ich in die <> klamm schreiben, damit ich in der while schleife jede zeile der datei bekomme. mit $file gehts irgendwie nicht, da kommt er nie in die schleife.


for my $file(@files){
print "1\n";
while ($line = <$file>)
{something
}
coax
 2006-01-14 22:28
#61903 #61903
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
Du musst jede Datei fuer sich oeffnen und durchlaufen.
Code: (dl )
1
2
3
open(FH, '<', $file) or die $!;
while(my $line = <FH>) {
# ...

Nicht vergessen die perldocs zu lesen die renee dir genannt hat! ;)
,,Das perlt aber heute wieder...'' -- Dittsche
esskar
 2006-01-15 02:06
#61904 #61904
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=renee,14.01.2006, 20:23]my @files = grep{-f $verzeichnis.'/'.$_}readdir(DIR);[/quote]
sowas ist mir zu
1. speicher intensiv
2. langsam

besser
Code: (dl )
1
2
3
4
5
6
7
opendir(DIR,$verzeichnis) or die $!;
while(my $filename = readdir DIR)) {
  my $file = $verzeichnis . '/' . $filename;
  next unless -f $file;
  # durchsuchen
}
closedir DIR;
\n\n

<!--EDIT|esskar|1137283646-->
renee
 2006-01-15 09:56
#61905 #61905
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
@esskar: jepp, hast recht...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
pKai
 2006-01-15 15:48
#61906 #61906
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Laufzeitmäßig benchmarke ich renees grep-Variante etwa 5% schlechter als esskars while.
Klar, Speicherverbrauch ist O(n) gegenüber O(1), aber außer man hat tausende von Dateien im Verzeichnis macht das IMHO nicht wirklich was aus?!
I sense a soul in search of answers.
esskar
 2006-01-15 16:22
#61907 #61907
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=pKai,15.01.2006, 14:48]Klar, Speicherverbrauch ist O(n) gegenüber O(1), aber außer man hat tausende von Dateien im Verzeichnis macht das IMHO nicht wirklich was aus?![/quote]
ja... sobald es aber rekursiv wird, wirds hässlich...

bei wenig datein/verzeichnissen macht es nicht viel aus... aber das weiß man ja nicht

(PS: stört mich momentan bei C# ... da gibt es IMHO nur die möglichkeit, ein array aller verzeichnisse/files geben zu lassen ... das kann ab und an sau langsam sein
renee
 2006-01-16 08:30
#61908 #61908
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Sobald es rekursiv wird, benutze ich eh CPAN:File::Find...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
pq
 2006-01-16 11:13
#61909 #61909
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
es geht auch noch einfacher:
Code: (dl )
perl -wle'print while <>' dir/*

<> kann man hier auch mit <ARGV> ersetzen.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< |< 1 2 >| >> 18 Einträge, 2 Seiten



View all threads created 2006-01-14 21:03.