Schrift
[thread]10711[/thread]

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

Leser: 25


<< |< 1 2 3 4 5 6 7 >| >> 61 Einträge, 7 Seiten
stormy2211
 2007-11-03 18:32
#101783 #101783
User since
2007-11-02
20 Artikel
BenutzerIn
[default_avatar]
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
63
64
65
66
67
68
69
70
71
72
73
#!C:\\Perl\bin\perl.exe
use strict;
use warnings;

my $test=0; #mit der Zahl wird die Anzahl der Dateien gelesen
my @Verzeichnis;
opendir(Freunde, 'C://Freunde') or die "Konnte Ordner nicht öffnen ($!)\n";
while(my $Filename=readdir(Freunde))
{next if($Filename eq '.' or $Filename eq '..');
if(-f 'C://Freunde/'.$Filename)
{$test=$test+1;
push(@Verzeichnis,$Filename);
}
}
closedir(Freunde);

my @Namensliste;
for my $Filename(@Verzeichnis)
{
$Filename=~/^(.+?)@/s;
push(@Namensliste,$1);
}


open(SPEICHERN,'>','C://Verzeichnis.txt') or die "Konnte Verzeichnis nicht Speichern ($!)\n";
print SPEICHERN join("\n",@Verzeichnis);
close(SPEICHERN);

open(SPEICHERN2,'>','C://Namensliste.txt') or die "Konnte Titelliste nicht Speichern ($!)\n";
print SPEICHERN2 join("\n",@Namensliste);
close(SPEICHERN2);

#des darüber stehende ab hier will ich nicht mehr verändern, des funzt ja alles dank hilfe =)
print "$test\n$Verzeichnis[03]\n$Namensliste[03]\n";
#übereinstimmung von verz-->namen und wieviele .txt es gibt wird angezeigt

my @inhalt;
my $Zahl;


for (my $s=00;$s<=$test;$s++)
#hier sage ich er soll alle Dateien der Reihe nach öffnen bis eben die letze Datei erledigt ist

{ #open
open (LESEN,"<C:/Freunde/$Verzeichnis[$s]");
my @inhalt=<LESEN>;
my $Data=join(' ', @inhalt);
#hier wird inhalt in eine Zeile gestopft 
#also slurpen soweit ich verstanden habe
for my $Name ($Namensliste[$s])


{ #for my bracket
#falls Name in Datei vorhanden, egal ob/mayer oder Mayer
#dann wird die Zahl um eins erhöht, falls es 2x vorkommt
#trotzdem nur einmal da if Bedinung 1x erfüllt und es
#dann gleich weiter geht
if($Data=~/$Name/i)

{ #if bracket
$Zahl++;
} #if bracket

} #for my bracket
close(LESEN)
} #close

print "$Zahl\n$test\n";
<stdin>
#hier lasse ich mir eben ausgeben in wievielen
#Textdateien der Name wo im Namen der Datei stand
#auch im Dateiinhalt steht und wieviele Dateien
#es insgesamt waren.

Meldung kommt für Line: 45,46,58
Das ist das fertige Ergebnis =))))
Wollte mich an dieser Stelle auch mich bei allen Bedanken die mich unterstützt haben und bestimmte Befehle, Begriffe einen Perl u. Progammier Anfänger nicht nur versucht haben sondern es auch geschafft haben zu erklären. Seid ne echt geile Community hier, hat mein Kumpel recht gehabt. =D
mfg stormy und nen verdammt schönen Abend an alle *dieweltumarm*
topeg
 2007-11-03 19:25
#101787 #101787
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
denk mal darüber nach was ich über den Zählindex von Aarrays und die Anzahl der Arrayeinträge gesagt habe.
der erste Eintrag in Arrays erreicht man mit "0"
Beispiel:
Code (perl): (dl )
my @Array=("Das","ist","ein","Satz.")

um den ersten Eintrag zu bekommen muss man schreiben:
Code (perl): (dl )
my $1ster_Eintrag=$Array[0]

Den Letzten Eintrg bekommt man mittels:
Code (perl): (dl )
my $4ter_Eintrag=$Array[3]

Siehst du nun was in Zeile 41 passiert? Du versuchst einen Eintrag mehr aus den Arrays aus zu lesen als existieren.
Es gibt nun drei Lösungen:
1: statt "$s<=$test" schreibst du "$s<$test"
2: statt "$s<=$test" schreibst du "$s<=$test-1"
3: statt "for (my $s=0;$s<=$test;$s++)" schreibst du "for (my $s=1;$s<=$test;$s++)" und überall wo du "$s" verwendest "$s-1"
topeg
 2007-11-03 19:34
#101788 #101788
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Übrigens was soll das in Zeile 50?
Code (perl): (dl )
for my $Name ($Namensliste[$s])

Die FOR-schleife wird nur einmal durchlaufen und zwar für den Eintrag "$Namensliste[$s]"
genauso gut kannst du schreiben:
Code (perl): (dl )
my $Name = $Namensliste[$s];

du willst doch das Array "@Namensliste" für jede geöffnete Datei einmal durch laufen und nicht nur für den Namen, dessen Datei du geöffnet hast.
richtig währe hier:
Code (perl): (dl )
for my $Name (@Namensliste)

oder
Code (perl): (dl )
1
2
3
for (my $t=0; $t<@Namensliste;$t++)
{
 my $Name=$Namensliste[$t];
topeg
 2007-11-03 20:07
#101789 #101789
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
So ist das ganze etwas Eleganter:
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
63
#!C:\\Perl\bin\perl.exe
use strict;
use warnings;

my $Basisverzeichnis='./';
my $Verzeichnis=$Basisverzeichnis.'Freunde';
my $Verzeichnis_Datei=$Basisverzeichnis.'Verzeichnis.txt';
my $Namen_Datei=$Basisverzeichnis.'Namensliste.txt';


my @Verzeichnis;
opendir(Freunde, $Verzeichnis) or die "Konnte Ordner '$Verzeichnis' nicht öffnen ($!)\n";
while(my $Filename=readdir(Freunde))
{
 next if($Filename =~/^\.|\.\.$/);
 push(@Verzeichnis,$Filename) if(-f $Verzeichnis.'/'.$Filename);
}
closedir(Freunde);

my @Namensliste;
for my $Filename (@Verzeichnis)
{
 $Filename=~/^(.+?)@/s;
 push(@Namensliste,$1);
}


open(SPEICHERN,'>',$Verzeichnis_Datei) or die "Konnte '$Verzeichnis_Datei' nicht Speichern ($!)\n";
print SPEICHERN join("\n",@Verzeichnis);
close(SPEICHERN);

open(SPEICHERN2,'>',$Namen_Datei) or die "Konnte '$Namen_Datei' nicht Speichern ($!)\n";
print SPEICHERN2 join("\n",@Namensliste);
close(SPEICHERN2);

my $Zahl;

#hier sage ich er soll alle Dateien der Reihe nach öffnen bis eben die letze Datei erledigt ist
for my $Dateiname (@Verzeichnis)
{
 open (LESEN,'<',$Verzeichnis.'/'.$Dateiname) or die "konnte '$Verzeichnis/$Dateiname' nicht öffnen ($!)\n";
 # Zeilentrenner für das Auslesen abschalten
 local $/=undef;
 # die ganze Datei in einem Rutsch einlesen
 my $Data=<LESEN>;

 for my $Name (@Namensliste)
 {
  #falls Name in Datei vorhanden, egal ob/mayer oder Mayer
  #dann wird die Zahl um eins erhöht, falls es 2x vorkommt
  #trotzdem nur einmal da if Bedinung 1x erfüllt und es
  #dann gleich weiter geht
  if($Data=~/$Name/i)
  {
   $Zahl++;
  }
 }
 close(LESEN)
}

print "Anzahl der Übereinstimmungen insgesammt: $Zahl\n";
print "Anzahl der Dateinamen: ".scalar(@Verzeichnis)."\n";
print "Anzahl der Namen: ".scalar(@Namensliste)."\n";

und bitte, bitte gewöhne dir das Einrücken an. Das hilft dir wirklich sehr bei größeren Projekten.
stormy2211
 2007-11-03 21:25
#101792 #101792
User since
2007-11-02
20 Artikel
BenutzerIn
[default_avatar]
Quote
du willst doch das Array "@Namensliste" für jede geöffnete Datei einmal durch laufen und nicht nur für den Namen, dessen Datei du geöffnet hast.

Ich will unter anderem ein schönes Auto u.ä., aber des ist gehört eher nicht hierher, was ich will ist folgendes mal als dummy-code(kann ich besser als perl*g*):
Name@ort.txt will ich den Name raus haben, dann öffne ich die Datei und suche nach Name, wenn ich was finde erhöhe ich um eins. Dann gehe ich zu nächsten Datei und mache dort das selbe: Name2@ort2.txt, da nehme ich mir wieder Name2 und öffne die Name2@ort2.txt Datei und suche nach Name2 und falls vorhanden erhöhe ich wieder um eins. Das was du meinst ist, dass ich die ganzen Namen dann habe und jede Datei nach diesen Namen durchforste, was so eigentlich auch ganz interessant wäre, ich aber nicht gemeint/gewollt hatte.
mfg stormy
ps:hoffe konnte mich jetzt verständlicher Ausdrücken im dummy code =)
bin halt nun mal nen anfänger(waren wir alle mal auch wenn ich es manchmal bei einigen bezweifle)
stormy2211
 2007-11-03 21:55
#101796 #101796
User since
2007-11-02
20 Artikel
BenutzerIn
[default_avatar]
Mhmm, eine Frage ist noch über:
Könnte ich theoretisch dieses Programm auf ein Netzwerkordner zugreifen lassen also auf //alle/freunde$ zum bsp.?!? Müsste ich dann statt C://Freunde immer //alle/freunde schreiben? Und was passiert mit dem $ wo muss das dann hin?
mfg stormy aka patrick
topeg
 2007-11-03 22:10
#101797 #101797
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Das vereinfacht die ganze Sach etwas.
Ließ dir das mal durch:
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
63
#!C:\\Perl\bin\perl.exe
use strict;
use warnings;

my $Basisverzeichnis='C://';
my $Verzeichnis=$Basisverzeichnis.'Freunde';
my $Verzeichnis_Datei=$Basisverzeichnis.'Verzeichnis.txt';
my $Namen_Datei=$Basisverzeichnis.'Namensliste.txt';


my @Verzeichnisliste;
opendir(Freunde, $Verzeichnis) or die "Konnte Ordner '$Verzeichnis' nicht öffnen ($!)\n";
while(my $Filename=readdir(Freunde))
{
 next if($Filename =~/^\.|\.\.$/);
 push(@Verzeichnisliste,$Filename) if(-f $Verzeichnis.'/'.$Filename);
}
closedir(Freunde);

my @Namensliste;
for my $Filename (@Verzeichnisliste)
{
 $Filename=~/^(.+?)@/s;
 push(@Namensliste,$1);
}


open(SPEICHERN,'>',$Verzeichnis_Datei) or die "Konnte '$Verzeichnis_Datei' nicht Speichern ($!)\n";
print SPEICHERN join("\n",@Verzeichnisliste);
close(SPEICHERN);

open(SPEICHERN2,'>',$Namen_Datei) or die "Konnte '$Namen_Datei' nicht Speichern ($!)\n";
print SPEICHERN2 join("\n",@Namensliste);
close(SPEICHERN2);

my $Zahl;

#hier sage ich er soll alle Dateien der Reihe nach öffnen bis eben die letze Datei erledigt ist
for my $counter (0..$#Verzeichnisliste)
# "$#Verzeichnisliste" gibt die Nummer des Letzten Eintrages im Array @Verzeichnisliste zurück
# (0..Wert) erzeugt eine Liste (Array) mit den Zahlen von 0 bis Wert.
{
 my $Name=$Namensliste[$counter];
 my $Datei=$Verzeichnisliste[$counter];

# print "$Name <> $Datei\n";
 open (LESEN,'<',$Verzeichnis.'/'.$Datei) or die "konnte '$Verzeichnis/$Datei' nicht öffnen ($!)\n";
 # Zeilentrenner für das Auslesen abschalten
 local $/=undef;
 # die ganze Datei in einem Rutsch einlesen
 my $Data=<LESEN>;
 close(LESEN);

 #falls Name in Datei vorhanden, egal ob/mayer oder Mayer
 #dann wird die Zahl um eins erhöht, falls es 2x vorkommt
 #trotzdem nur einmal da if Bedinung 1x erfüllt und es
 #dann gleich weiter geht
 $Zahl++ if($Data=~/$Name/i);
}

print "Anzahl der Übereinstimmungen insgesammt: $Zahl\n";
print "Anzahl der Dateinamen: ".scalar(@Verzeichnisliste)."\n";
print "Anzahl der Namen: ".scalar(@Namensliste)."\n";
topeg
 2007-11-03 22:17
#101798 #101798
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
so weit ich weiß, ist der Zugriff auf einen Netzwerkordner mit Perl so einfach nicht möglich. Pfade wie "smb:\\netzwerkdevice" funktionieren nur im Explorer und stehen nur über die entsprechenden Bibliotheken zur Verfügung. Es gibt Perlmodule für "smb", benutzt habe ich sie noch nicht und du solltest erst noch etwas sicherer in der Programmierung werden, bevor du dich an so was traust.

Meine unqualifizierte Meinung lautet also nein, oder zumindest nicht so einfach.
Aber du könntest die Laufwerke vorübergehend lokal einbinden, da gibt es sicher Befehle für.
stormy2211
 2007-11-03 22:41
#101800 #101800
User since
2007-11-02
20 Artikel
BenutzerIn
[default_avatar]
Sagen wir mal ich binde dieses Laufwerk auf T: oder so ein müsste ich dann einfach T://alle/Freunde$ eingeben, weil $ steht ja eigentlich für Variabeln?
mfg stormy
topeg
 2007-11-03 22:46
#101801 #101801
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Wenn du das Laufwerk eingebunden hast solltest du ohne Probleme darauf zugreifen können.
<< |< 1 2 3 4 5 6 7 >| >> 61 Einträge, 7 Seiten



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