Font
[thread]10711[/thread]

Dir ohne Unterordner in .txt Datei u.ä.. Wie?

Readers: 25


<< |< 1 2 3 4 ... 7 >| >> 61 entries, 7 pages
stormy2211
 2007-11-02 21:31
#101707 #101707
User since
2007-11-02
20 articles
BenutzerIn
[default_avatar]
So erst mal nen schönen Abend an alle =)

und nu zu meinem Problem:
Ich habe gestern mit Perl angefangen und wollte mal ein kleines Projekt/Aufgabenstellung ausprobieren, nämlich folgende:
Ein Musikverzeichnis von Eigene Musik in einer .txt speichern wo nur die Liednamen drinstehen.
1. Ich hab meinen Ordner mit Musik(Eigene Musik), dort hab ich aber noch weitere Unterverzeichnisse die ich nicht mit aufgelistet haben will, sprich alle Dateien wo auf .mp3 enden nur(und dadurch keine Ordner).
2. Meine Lieder sind alle mit Titel@Interpret.mp3 benannt. Ich will zwar eine Liste haben vom Verzeichnis mit Titel@Interpret.mp3, dann aber noch eine 2te mit nur Titel, sprich bloß bis zum "@"-Zeichen, hab aber keine Ahnung wie.
3. Ich will die Liste unter C:\\Meine Verwaltung von Multimedia\Musik speichern.

Wäre nett wenn ihr mir da helfen könntet und eventuell noch erklären wieso der und der Befehl da und da kommen muss und was das bezweckt. Danke!

Mit meinem sehr begrenzten wissen bin ich nur soweit gekommen (Hoffe ich mache das mit /perl usw. jetzt richtig):


Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!C:\\Perl\bin\perl.exe
opendir(Musik,"C:\Dokumente und Einstellungen\Stormy\Eigene Dateien\Eigene Musik\");
#ist mein Musikverzeichnis was ich hier öffne
@Liederliste=readdir Musik;
#hier speichere ich das Verzeichnis als
#.txt Datei in die @Liederliste
closedir(Musik);
$Anzahllieder=$Liederliste;
#hier zähle ich die Anzahl meiner Lieder durch
for ($s=0;$s<=$Anzahllieder;$s=$s+1)
#Angabe wieviele Titel es der Liste hinzufügen soll
{$Titel=index($Liederliste[$s],"@");push(@Titelliste,$Titel);}
#Befehl dass nur die einzelnen Werte der Liste bis zum "@"-Zeichen gelesen
#werden und in einer extra Liste abgespeichert werden
open(SPEICHERN,">C:\\Meine Verwaltung von Multimedia\Musik\Liederliste.txt");
print SPEICHERN @Liederliste;
close(SPEICHERN);
open(SPEICHERN2,">C:\\Meine Verwaltung von Multimedia\Musik\Titelliste.txt");
print SPEICHERN2 @Titelliste;
close(SPEICHERN2);
#Speicherung der 2 Listen in meinem Verwaltungsordner.




Mir fehlt halt das nur .mp3s in der Liste gespeichert werden
und bin mir nicht sicher ob es die Dateien auch
unter den angegeben Pfaden ausliest bzw. abspeichert.
Bin mir auch nicht sicher ob ich mit dem "nur Titel" abspeichern richtig
gemacht habe, wie schon gesagt bin neu auf dem Gebiet hier, aber an
diesem Wochenende wollte ich wenigstens das hier packen. =)

Vielen Dank im Vorraus für eure Hilfe
mfg stormy

ps: SuFu ging nicht, stand was dran von wird grad erweitert o.ä.
#Kein Kommentar
 2007-11-02 22:30
#101715 #101715
User since
2007-06-09
575 articles
HausmeisterIn
[default_avatar]
okay, auf die schnelle:

[ol]
[li]Perl kommt von Unix, deshalb bei Pfadangaben statt "\", "/" verwenden[/li]
[li]use strict ist immer gut[/li]
[/ol]

wenn du die anzahl der elemente eines arrays haben willst, musst du das so machen:
Code: (dl )
my $anzahl = @array;

Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
stormy2211
 2007-11-02 22:49
#101718 #101718
User since
2007-11-02
20 articles
BenutzerIn
[default_avatar]
Danke für die schnelle Antwort!
Ich nehme an @array ist immer die zuletzt ausgegebene Liste, oder?
Und weißt du zufällig wie man wenn man in einem Verzeichnis die lästigen .. und . und Ordnernamen wegbekommt, wenn man nur die .mp3 Dateien haben will?
Bin neu auf dem Perlbereich, deswegen sry für solche Anfängerfragen.
mfg stormy
edit: die Frage:für was steht my eigentlich? rausgenommen, da im Beitrag verlinkt.
edit2: ich habs doch gewusst war schon wieder voreilig, Frage:langt $anzahl=@array nicht auch? rausgenommen, die Antwort war auch im Link.
topeg
 2007-11-03 00:31
#101721 #101721
User since
2006-07-10
2611 articles
BenutzerIn

user image
Ein paar Verbesserungsvorschläge und Anmerkungen:
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
#!C:\\Perl\bin\perl.exe

# Verhintert Vertipper, fehlerhafte Definitionen und noch so manches Ärgernis :)
###################
use strict;
use warnings;
###################

# mit Windowspfaden kenne ich mich nicht so aus,
# aber Perl wandelt die Unixspezifische Schreibweise normalerweise passend um. 
opendir(Musik, 'C://Dokumente und Einstellungen/Stormy/Eigene Dateien/Eigene Musik');
#ist mein Musikverzeichnis was ich hier öffne
my @Liederliste=readdir Musik;
#hier speichere ich das Verzeichnis als
#.txt Datei in die @Liederliste
closedir(Musik);

#$Anzahllieder=@Liederliste; # Wenn ein Array skalar abgefragt wird, wird nur die Anzahl der Eintträge übergeben 
#hier zähle ich die Anzahl meiner Lieder durch

# das funktioniert so leider nicht
##################################
#for ($s=0;$s<=$Anzahllieder;$s=$s+1)
#Angabe wieviele Titel es der Liste hinzufügen soll
#{$Titel=index($Liederliste[$s],"@");push(@Titelliste,$Titel);}
#Befehl dass nur die einzelnen Werte der Liste bis zum "@"-Zeichen gelesen
#werden und in einer extra Liste abgespeichert werden
###################################
# Index lifert die Position eines Stinges innerhalb eines anderen.
# @Titelliste wird bei jedem Durchlauf neu initialisiert
# und außerhalb der Schleife ist es unbekannt.
# Wenn man ein ganzes Array durch gehen will, so kann man das auch anders schreiben:
# for my $filename (@Liederliste)
# Außerdem "$s=$s+1" kann man auch so schreiben "$s++"
# weiterhin müßte es "$s<$Anzahllieder" heißen, denn in "$Anzahllieder" steht die Anzahl der Einträge,
# aber im Array wird von 0 an gezählt und damit ist der letzte Eintrag "$Anzahllieder-1"

# so würde ich es machen:
my @Titelliste; # das Array vor der Scheife definieren!
for my $Filename (@Liederliste)
{
 # siehe Reguläre Ausdrücke
 $Filename=~/^(.+?)@/s;
 push(@Titelliste,$1);
}

open(SPEICHERN,'>','C://Meine Verwaltung von Multimedia/Musik/Liederliste.txt');
print SPEICHERN join("\n",@Liederliste);
close(SPEICHERN);

open(SPEICHERN2,'>','C://Meine Verwaltung von Multimedia/Musik/Titelliste.txt');
print SPEICHERN2 join("\n",@Titelliste);
close(SPEICHERN2);
#Speicherung der 2 Listen in meinem Verwaltungsordner.

# Leere Zeilen helfen den Code etwas zu strukturieren.
# Einrücken genauso :)


Ich habe es nicht getestet. Es können noch Schreibfehler drin sein... ;-)
stormy2211
 2007-11-03 01:03
#101722 #101722
User since
2007-11-02
20 articles
BenutzerIn
[default_avatar]
Wow, danke, aber ich als newbi kann damit nicht so arg viel anfangen, ich meine nicht dass es unnütz wäre, aber paar Begriffe sind mir noch unklar (experementiere ja erst seid gestern mit Perl) die du mir noch erklären müsstest:
1. Was sind arrays?
2. Für was steht $1 in Zeile 44, wo ist die Variable definiert/festgelegt/verändert worden? (kenne nur Standard Variable $_)
3. Für was steht bzw. macht for my? (kenne bloß for(;;){;} und foreach(){;} )
4. Was bringt der Befehl join (Z.48+52)?
5. Gibt es irgendwo ein Verzeichnis wo man die ganzen Befehle mit entsprechender Syntax nachschauen kann?
6. Nochmal ein Dickes Danke, ihr habt mir bis jetzt sehr geholfen.

mfg stormy und einen schönen abend/nacht noch

edit:7: In meinem Eigene Musik Verzeichnis sind auch noch Ordner die in der Liste als .. . und backup etc. abgespeichert sind. Was kann ich machen dass in der Liste nur noch .mp3´s verzeichnet sind?
topeg
 2007-11-03 01:30
#101723 #101723
User since
2006-07-10
2611 articles
BenutzerIn

user image
Zu "Array"
Allso Ein Array ist eine Liste von Werten und wird unter Perl mit einem "@" am Anfang markiert.

Zu "my"
"my" Deklariert eine Variable. Damit Erkennt Perl, dass du sie Bewusst einführst und dich nicht irgendwo verschrieben hast (Noch ein paar Sachen mehr aber das ist erstmal nicht von belang.) Das bringt aber nur in Verwendung mit "use strict;" etwas.

Zu "$1"
Wenn du es ganz genau wissen willst mußt du dich über Reguläre ausdrücke informieren.
Aber kurz. Da steht drin was der Reguläre Ausdruck gefunden hat. Um den Ausdruck den ich oben verwendet habe zu erklären:
Mit einem Regulärer Ausdruck versucht einen zu String so allgemein wie möglich und so genau wie nötig zu beschreiben. Dazu gibt es eine Reihe von Schlüsseln (meisst einzelne Zeichen)
Also zu diesem Regulären Ausdruck:
$Filename=~/^(.+?)@/s;
Heißt so viel wie "Übergieb das an $1 was zwischen dem Anfang des Stringes und dem nächsten @ steht"
Speziell:
"=~//" Sagt Perl es handelt sich um ein Regexp. Alles zwischen den "/" ist der Reguläre Ausdruck selber.
"^" Ist die "Umschreibung" für den Stinganfang
"()" alles was da zwischen steht landet in "$1"
"." "Umschreibung" für ein beliebiges Zeichen. Alle Zeichen passen darauf.
"+?" finde die Vorherige "Umschreibung" mindestens Einmal und gehe nur soweit bis die hinten dran stehende "Umschreibung" oder Zeichen gefunden wird.
"@" das Zeichen "at" selber.

zu "for my"
Wie oben beschrieben dient "my" dazu eine Variable zu definieren. Das kann man an nache zu jeder beliebigen Stelle im Code machen. Diese spezielle Schreibweise hat sich "Eingebürgert"
Alls Beispiel sind gleichbedeutend:

Code (perl): (dl )
1
2
my $var;
foreach $var (@liste)

Code (perl): (dl )
1
2
my $var;
for $var (@liste)

Code (perl): (dl )
1
2
3
4
my $var;
my $i;
for($i=0; $i<@liste; $i++){
  $var=$liste[$i];

Code (perl): (dl )
1
2
3
my $var;
for(my $i=0; $i<@liste; $i++){
  $var=$liste[$i];

Code (perl): (dl )
foreach my $var (@liste) 

Code (perl): (dl )
for my $var (@liste)


zu "join"
"join" fügt Arrays (und Listen) mit einem Zeichen als Trenner zwischen den einzelnen Arrayeinträgen zusammen. Alls Beispiel;
wir haben das Array
Code (perl): (dl )
@array=("Das","ist","ein","Satz.")

Code (perl): (dl )
join(" ",@array)

gibt nun "Das ist ein Satz." zurück
Oder
Code (perl): (dl )
join("\n",@array)

liefert zurück:
"Das
ist
ein
Satz."
Oder
Code (perl): (dl )
join(" Bla ",@array)

Liefert: "Das Bla ist Bla ein Bla Satz."

Ich bei meiner Überarbeitung deines Scriptes leider das ausschließen der Verzeichnisse und ein paar nützliche Fehlermeldungen vergessen.
Darum hier das Script noch mal:
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
74
75
76
77
78
#!C:\\Perl\bin\perl.exe

# Verhintert Vertipper, fehlerhafte Definitionen und noch so manches Ärgernis :)
###################################
use strict;
use warnings;
###################################

# mit Windowspfaden kenne ich mich nicht so aus,
# aber Perl wandelt die Unixspezifische Schreibweise normalerweise passend um. 
#opendir(Musik, 'C://Dokumente und Einstellungen/Stormy/Eigene Dateien/Eigene Musik');
#ist mein Musikverzeichnis was ich hier öffne
#my @Liederliste=readdir Musik;
#hier speichere ich das Verzeichnis als
#.txt Datei in die @Liederliste
#closedir(Musik);

###################################
my @Liederliste
# "open" mit Fehlermeldung wenn es nicht klappt.
opendir(Musik, 'C://Dokumente und Einstellungen/Stormy/Eigene Dateien/Eigene Musik') or die "Konnte Ordner nicht öffnen ($!)\n";
while(my $Filename =readdir(Musik))
{
 # "." und ".." überspringen
 next if($Filename eq '.' or $Filename eq '..');
 # Ist es eine datei?
 if(-f 'C://Dokumente und Einstellungen/Stormy/Eigene Dateien/Eigene Musik/'.$Filename)
 {
  push(@Liederliste,$Filename);
 }
}
closedir(Musik);
###################################


#$Anzahllieder=@Liederliste; # Wenn ein Array skalar abgefragt wird, wird nur die Anzahl der Eintträge übergeben 
#hier zähle ich die Anzahl meiner Lieder durch

# das funktioniert so leider nicht
##################################
#for ($s=0;$s<=$Anzahllieder;$s=$s+1)
#Angabe wieviele Titel es der Liste hinzufügen soll
#{$Titel=index($Liederliste[$s],"@");push(@Titelliste,$Titel);}
#Befehl dass nur die einzelnen Werte der Liste bis zum "@"-Zeichen gelesen
#werden und in einer extra Liste abgespeichert werden
###################################
# Index lifert die Position eines Stinges innerhalb eines anderen.
# @Titelliste wird bei jedem Durchlauf neu initialisiert
# und außerhalb der Schleife ist es unbekannt.
# Wenn man ein ganzes Array durch gehen will, so kann man das auch anders schreiben:
# for my $filename (@Liederliste);
# Außerdem "$s=$s+1" kann man auch so schreiben "$s++"
# weiterhin müßte es "$s<$Anzahllieder" heißen, denn in "$Anzahllieder" steht die Anzahl der Einträge,
# aber im Array wird von 0 an gezählt und damit ist der letzte Eintrag "$Anzahllieder-1"

##################################
# so würde ich es machen:
my @Titelliste; # das Array vor der Scheife definieren!
for my $Filename (@Liederliste);
{
 # siehe Reguläre Ausdrücke
 $Filename=~/^(.+?)@/s;
 push(@Titelliste,$1);
}
##################################


open(SPEICHERN,'>','C://Meine Verwaltung von Multimedia/Musik/Liederliste.txt') or die "Konnte Liderliste nicht Speichern ($!)\n";
print SPEICHERN join("\n",@Liederliste);
close(SPEICHERN);

open(SPEICHERN2,'>','C://Meine Verwaltung von Multimedia/Musik/Titelliste.txt') or die "Konnte Titelliste nicht Speichern ($!)\n";
print SPEICHERN2 join("\n",@Titelliste);
close(SPEICHERN2);
#Speicherung der 2 Listen in meinem Verwaltungsordner.

# Leere Zeilen helfen den Code etwas zu strukturieren.
# Einrücken genauso :)
topeg
 2007-11-03 01:43
#101724 #101724
User since
2006-07-10
2611 articles
BenutzerIn

user image
Ach ja zu Einfühungen in Perl:
Wiki:PerlTutorials
oder in irgend einer Suchmaschine: "Perl Tutorial"
stormy2211
 2007-11-03 01:47
#101725 #101725
User since
2007-11-02
20 articles
BenutzerIn
[default_avatar]
Das ging flott =) Nochmal danke, gleich mal abschreiben und im Geiste wiederholen was was war und wozu es dient,so dass ich in Zukunft nicht mehr fragen brauche. =)
was es da nicht alles für befehle gibt und sonst noch alles wo ich in der Einführung gestern gar nicht vorgekommen *kopfschüttelt*

Code (perl): (dl )
1
2
3
4
#!C:\\Perl\bin\perl.exe
for ($s=0;$s<=100;$s++) 
{print "Danke\n";}
<stdin>



mfg stormy
ps:ihr seid doch alle FreakZ *g*
(falls sich irgendjmd darüber jetzt aufregt, dem mag gesagt sein dass dieses "FreakZ"-Wort wegem eurem enormen Wissen enstanden ist und bei mir nichts anders als Neid in Form von Buchstaben symbolisiert und somit eigentlich eine Art Staunen über euer Wissen ist, da mein momentanes Wissen über Perl Befehle usw. eher in meinem Hirn einen Minimalanteil einimmt.)
pq
 2007-11-03 04:08
#101728 #101728
User since
2003-08-04
12204 articles
Admin1
[Homepage]
user image
topeg+2007-11-03 00:30:11--
Zu "my"
"my" Deklariert eine Variable. Damit Erkennt Perl, dass du sie Bewusst einführst und dich nicht irgendwo verschrieben hast (Noch ein paar Sachen mehr aber das ist erstmal nicht von belang.) Das bringt aber nur in Verwendung mit "use strict;" etwas

naja, stimmt so nicht ganz. my() zu benutzen bringt immer was. man benutzt my() nicht,
damit strict die klappe haelt, sondern weil my() hilft, programmierfehler zu vermeiden,
und strict einem dabei neterweise hilft =)
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
topeg
 2007-11-03 13:10
#101737 #101737
User since
2006-07-10
2611 articles
BenutzerIn

user image
So hatte ich es ja gemeint.
<< |< 1 2 3 4 ... 7 >| >> 61 entries, 7 pages



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