Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]10711[/thread]

Dir ohne Unterordner in .txt Datei u.ä.. Wie? (Seite 6)

Leser: 25


<< |< 1 ... 3 4 5 6 7 >| >> 61 Einträge, 7 Seiten
schmetterling
 2013-02-20 12:06
#165906 #165906
User since
2013-02-18
6 Artikel
BenutzerIn

user image
wie gesagt, hier kommen schon die Fragen :
ich möchte die FileListe beschränken, indem ich mit m// sagen, dass er nur Dateien listen soll, die XA heißen.
1.ich habe zig Muster probiert, aber es werden auch Dateien namens XA.txt und XA.utf8 gezeigt. Was ist überhaupt die Endung von Dateien , die keine Endung haben und in deren Eigenschaften unter Dateityp nur "Datei" steht?
2.dieser Code ist, so wie ich verstanden habe, nur für ein Verzeichnis mit Unterverzeichnisse geeignet, die keine Unterverzeichnisse mehr haben.
Was ist , wenn ich nicht weiß, wie viele Unterverzeichnisse jedes Unterverzeichnis hat? Dass opendir() solange läuft, bis es kein Dir mehr gibt?
3.opendir(my $DirHandle, $Dir)
an einigen Stellen steht als Filehandle eine Variable und an anderen nur z.B. DIR. Gibt es einen Unterschied? sollte man lieber wie "my $DirHandle" schreiben oder geht auch nur DIR ?

Da ich mit der Einschränkung der Dateien nicht weiter gekommen bin, bin ich noch nicht zum nächsten Schritt, die Datei zu durchsuchen, gekommen! werds aber versuchen....
GUIfreund
 2013-02-20 12:47
#165907 #165907
User since
2011-08-08
559 Artikel
BenutzerIn
[default_avatar]
2013-02-20T11:06:40 schmetterling
ich möchte die FileListe beschränken, indem ich mit m// sagen, dass er nur Dateien listen soll, die XA heißen.
1.ich habe zig Muster probiert, aber es werden auch Dateien namens XA.txt und XA.utf8 gezeigt. Was ist überhaupt die Endung von Dateien , die keine Endung haben und in deren Eigenschaften unter Dateityp nur "Datei" steht?

Vermutlich hast du deine Muster nicht am Stringende verankert. Zeig doch mal ein paar deiner Versuche, dann können wir schnell sagen, was nicht stimmt.

2013-02-20T11:06:40 schmetterling
2.dieser Code ist, so wie ich verstanden habe, nur für ein Verzeichnis mit Unterverzeichnisse geeignet, die keine Unterverzeichnisse mehr haben.
Was ist , wenn ich nicht weiß, wie viele Unterverzeichnisse jedes Unterverzeichnis hat? Dass opendir() solange läuft, bis es kein Dir mehr gibt?

Wenn opendir() ein Verzeichnis findet, müsstest du dieses durchsuchen (mit einer anderen my-Variable als Filehandle). Dabei wirst du vorhandenen Kode wiederverwenden wollen. Das ist dann nicht mehr ganz trivial.

2013-02-20T11:06:40 schmetterling
3.opendir(my $DirHandle, $Dir)
an einigen Stellen steht als Filehandle eine Variable und an anderen nur z.B. DIR. Gibt es einen Unterschied? sollte man lieber wie "my $DirHandle" schreiben oder geht auch nur DIR ?

In Perl geht vieles, was total veraltet ist. Bleibe lieber bei "my $DirHandle". Und beginne deine Programme stets mit den Zeilen
Code (perl): (dl )
1
2
use strict;
use warnings;

Das wird dich vor so manchem Ärger bewahren.

Was meinst du mit an einigen Stellen? Bestimmt nicht die opendir-Variante von topeg. topeg tut so etwas nicht.

Zum Lernen ist es nicht schlecht, dein Problem erst mal mit opendir zu lösen. Aber dann solltest du dich mit dem Modul File::Find::Rule befassen - spätestens, wenn du dein Problem 2 angehen willst.[/quote]
Gruß
GUIfreund
hlubenow
 2013-02-20 20:53
#165926 #165926
User since
2009-02-22
875 Artikel
BenutzerIn
[default_avatar]
2013-02-20T11:06:40 schmetterling
2.dieser Code ist, so wie ich verstanden habe, nur für ein Verzeichnis mit Unterverzeichnisse geeignet, die keine Unterverzeichnisse mehr haben.
Was ist , wenn ich nicht weiß, wie viele Unterverzeichnisse jedes Unterverzeichnis hat? Dass opendir() solange läuft, bis es kein Dir mehr gibt?

Zeig doch bitte mal, wie Du einfach ein Verzeichnis nach Dateien und Unterverzeichnissen durchsuchst und deren Namen ausgibst. Das wäre doch schonmal ein Anfang. Dabei mußt Du das Modul "File::Find" verwenden, das ist jedenfalls der einfachste Weg.
Gast wer
 2013-02-20 22:24
#165929 #165929
Etwas zum lesen. Unsortiert:
Verzeichnis rekursiv löschen
Verzeichnis rekursiv auslesen und in Datenbank schreiben
Dateien rekursiv suchen
File::Find Probleme
Vergleich Variable mit String
Da findest du einiges in Bezug auf Verzeichnisse Lesen. "Rekusion" ist das Stichwort
Last edited: 2013-02-20 22:42:47 +0100 (CET)
hlubenow
 2013-02-21 01:00
#165931 #165931
User since
2009-02-22
875 Artikel
BenutzerIn
[default_avatar]
Guest wer
"Rekusion" ist das Stichwort

Ja, sicher. Aber ein Anfänger, der erstmal lernen muß, was überhaupt eine Funktion ist, wird sich schwertun, Rekursion zu begreifen.
Das Modul "File::Find" hat eine bestimmte Syntax, um das Durchsuchen zu erreichen. Die muß man nur so halbwegs verstehen und kann sich das für den Anfang aus den Beispielen zusammenbasteln. Um "File::Find" zu verwenden, muß man Rekursion gar nicht verstehen. Daher der Hinweis oben: Zeig mir, ob Du mit "File::Find" umgehen kannst, und ich sage Dir, ob Du Dein (erstes) Problem bewältigst bekommst.
schmetterling
 2013-03-01 12:10
#166104 #166104
User since
2013-02-18
6 Artikel
BenutzerIn

user image
Quote
Vermutlich hast du deine Muster nicht am Stringende verankert. Zeig doch mal ein paar deiner Versuche, dann können wir schnell sagen, was nicht stimmt.


danke für den Hinweis. hat in dieser Form "/^XA$/" geklappt. das sind halt Kleinigkeiten, auf die man als Anfänger nicht drauf kommt :)

Quote
Was meinst du mit an einigen Stellen? Bestimmt nicht die opendir-Variante von topeg. topeg tut so etwas nicht.


damit meinte ich auf verschiedenen Webseiten oder in verschiedenen Tutorien.

Quote
Dabei mußt Du das Modul "File::Find" verwenden, das ist jedenfalls der einfachste Weg.


dieses Modul kannte ich ja noch nicht, war aber relativ hilfreich. damit habe ich nur die Dateien finden und auf der Konsole zeigen können. geht es auch , dass ich nach File::Find sage , dass im Inhalt dieser gefundenen Dateien nach ein besonderes Suchmuster gesucht, ersetzt und in einer neuen Datei geschrieben werden soll?

ich habe versucht mit Subroutinen erstmal die Sache mit opendir() für mehrere Verzeichnisse zu testen. mein Code sieht folgendes aus : (hat sicher viele Fehler ! wollte es gerne selber hinkriegen, aber komm nicht weiter :( )
Code: (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
use strict;
use warnings;

my $Dir='C:/1';
&opdir();


sub opdir{

opendir (my $DirHandle,$Dir) or die "dir nicht gefunden\n";

while(my $Filename = readdir($DirHandle))
{
next if($Filename eq '.' or $Filename eq '..');

if(-d $Dir.'/'.$Filename)
{
my $SubDir = $Dir.'/'.$Filename;
&opdir($SubDir);
}
elsif(-f $Dir.'/'.$Filename)
{
my $File = $Dir.'/'.$Filename;
&opfile($File);
}
}
}

sub opfile{

open (my $FileHandle,$Dir) or die "file nicht gefunden\n";

while (my $zeile = <$FileHandle>)
{
print "$zeile\n";

}
}


bin dir und den anderen sehr dankbar für eure duldige Hilfestellung !!
GUIfreund
 2013-03-01 17:44
#166115 #166115
User since
2011-08-08
559 Artikel
BenutzerIn
[default_avatar]
Das klappt ja schon ganz gut mit der Rekursion, du bist nicht mehr weit vom Ziel. Dein Hauptproblem ist im Moment die Parameterübergabe an Subroutinen. Aus Sicht der sub stehen die in einem Array namens @_. Dort musst du sie herausholen. Für einen einzelnen Parameter macht man das üblicherweise so:
Code (perl): (dl )
1
2
sub opdir {
    my $Dir = shift;

Bei mehreren Parametern schreibt man
Code (perl): (dl )
1
2
sub opdir{
    my ($max, $moritz) = @_;

oder auch
Code (perl): (dl )
1
2
sub opdir{
    my @feld = @_;

Das my $Dir in sub opdir kommt übrigens nicht mit dem am Anfang in Konflikt, und auch nicht mit dem aus früheren - noch nicht abgeschlossenen - Aufrufen von opdir. Das ist wichtig für die Rekursion. Es maskiert das alte nur, bis es (spätestens) am Ende der sub stirbt, wodurch der vorherige Wert wieder sichtbar wird.

Noch ein paar Tipps:

Lass das & beim Aufruf von Unterprogrammen weg. Es ist total veraltet und kann außerdem Ärger machen.

In sub opfile schreibe besser $file statt $Dir - schließlich ist es keine Directory.

Überarbeite mal deine Einrückung in sub opdir. Im Moment sieht's wie Kraut und Rüben aus. in sub opfile ist es schon viel besser.

Zum Testen drucke am Anfang von sub opfile den empfangenen Filenamen und mache danach sofort return. Wenn die Rekursion steht, ist es Zeit, dich um den Inhalt der Datei zu kümmern.
Gruß
GUIfreund
schmetterling
 2013-03-04 10:31
#166182 #166182
User since
2013-02-18
6 Artikel
BenutzerIn

user image
vielen Dank für deine Hinweise und Tipps.
Hoffentlich werd ichs auch mal so beherschen wie du :) bin einbisschen voreilig !
Ihr und überhaupt diese Seite seid eine super unterstützung für Anfänger wie ich ;)
bis später
schmetterling
 2013-03-04 11:37
#166193 #166193
User since
2013-02-18
6 Artikel
BenutzerIn

user image
und schon steh ich vor dem nächsten Problem :(
ich hab die Hinweise und Tipps in mein Prog. verwendet und es funktioniert. danach hab ich weitere Befehle da rein geschrieben , so dass es die Verzeichnisse solange öffnet, bis er bei einem txt-file landet. dann soll er den file öffnen und im Inhalt ein Suchmuster finden, ersetzen und in eine neue Datei schreiben.ich hab es , damit ich nicht überfordert werde, erst mit zwei Verzeichnisse und eine Textdatei probiert. es funktioniert.
mein Problem ist nun folgendes:
ich habe zig Verzeichnisse. in jedem gibt es eine Datei, die keine txt-Endung hat, aber beinhaltet einen text. das Prog. soll die Verzeichnisse durchgehen, jede Datei in jedem Verzeichnis öffnen, suchen, ersetzen, dann das neue Inhalt mit dem Namen des Verzeichnisses, worin die Datei liegt, neu speichrn. z.B. ich habe Dir 1/2, 1/3, 1/4 (d.h in Verz.1 gibt es drei Unterverz. 2,3,4). nun soll er die Datei "1/2/mytext" mit den Namen 2.txt(Überordner.txt) irgendwo anders speichern. Ich weiss nicht, wie ich den Verzeichnisnamen als Name der Datei angeben kann.
hab es zu kompliziert erklärt fällt mir gerade auf !!

mein Code bis jetzt:
Code: (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
use strict;
use warnings;

my $Dir='C:/1';
opdir($Dir);


sub opdir{

my ($Dir) = shift;
opendir (my $DirHandle,$Dir) or die "dir nicht gefunden\n";

while(my $Filename = readdir($DirHandle))
{
print "Filename='$Filename'\n";
next if($Filename eq '.' or $Filename eq '..');

if(-d $Dir.'/'.$Filename)
{
my $SubDir = $Dir.'/'.$Filename;
opdir($SubDir);

}
elsif(-f $Dir.'/'.$Filename)
{
my $File = $Dir.'/'.$Filename;
opfile($File);
}
}
}

sub opfile{

my ($File) = shift;
print "File: $File\n";
#return;
open (my $FileHandle,$File) or die "file '$File' nicht gefunden: $!\n";
open (my $Schreiben,'>',"C:/geaendert/mytext.txt") or die "kann nicht schreiben $!\n";
while(my $zeile = <$FileHandle>)
{
#chomp;
#print "$zeile\n";
$zeile=~ s/l/*/g;
print "$zeile\n";
print $Schreiben "$zeile\n";
}

}
GUIfreund
 2013-03-04 17:56
#166212 #166212
User since
2011-08-08
559 Artikel
BenutzerIn
[default_avatar]
In $pfad hast du deinen Dateipfad, und da möchtest du jetzt den Namen des übergeordneten Ordners herausholen - das habe ich hoffentlich richtig verstanden. Das kannst du mit split(/\//, $pfad); erreichen, falls du nicht \ als Trennzeichen in $pfad hast (das kann bei Windows passieren, je nachdem, wo du den Pfad herhast). Im letzten Element (Index -1) des Ergebnisses steht der Dateiname, bei Index -2 der gesuchte Name.

Übrigens kopiert man Dateien nicht zeilenweise. Dafür gibt es das Modul File::Copy.
Gruß
GUIfreund
<< |< 1 ... 3 4 5 6 7 >| >> 61 Einträge, 7 Seiten



View all threads created 2007-11-02 21:31.