Schrift
[thread]10711[/thread]

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

Leser: 25


<< |< 1 2 3 4 5 ... 7 >| >> 61 Einträge, 7 Seiten
stormy2211
 2007-11-03 15:12
#101742 #101742
User since
2007-11-02
20 Artikel
BenutzerIn
[default_avatar]
*hust* Duell der Giganten *g*
Hätte da noch ne Herausforderung für euch oder auch:
Bräuchte noch mal eure Hilfe. =)
Des mit den Listen etc. funktioniert einwandfrei, auch keine Rechtschreibfehler drin gewesen. Habs dann gleich dann mal an einem anderen Ordner ausprobiert.
Hab jetzt mal nen Ordner Freunde erstellt, in dem ich schön ganz viele txt Dateien im Format Name@Ort.txt abgespeichert habe.
Soweit so gut, liest das Verzeichnis schön aus usw., hab dann auch noch was zum zählen reingepackt weil ich mir gedacht hab ist doch interessant wieviele Dateien es dann sind und man es später noch gebrauchen kann.
Das was ich mir in den Kopf gesetzt habe bzw. wissen will wie es funktioniert:
Die Dateien nacheinander öffnen und in jeder jeweils nach dem Namen von dem Freund suchen(sprich in Datei mayer@ort.txt nach mayer, aber in mülller@ort2.txt nach müller usw.), falls vorhanden dann eine Zahl um 1 erhöhen, so dass ich weiß in wievielen Textdateien der Name des jeweiligen Freundes enthalten ist.
Hab auch schon grob was erstellt, weiß allerdings nicht wie ich mit Perl richtig suchen kann. Hab den Code davor auch mal mit reingepackt, wegen der $test Zahl die die Anzahl der Dateien zählt.
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
#!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 $Zahl; 
#Die Zahl die erhöht werden soll, sofern in der
#Datei Mayer@München.txt der Namen Mayer vorhanden ist(also im Inhalt)
#kann sein das eventuell auch /Mayer dran steht.
my @inhalt;
#ist wo für jede Datei deren Inhalt abgespeichert wird
for (my $s=00;$s<=$test;$s++) 
{
open(LESEN,"<","C://Freunde/$Verzeichnis[$s]");
@inhalt=<LESEN>;

##########################################
# Hier bräuchte ich jetzt etwas was jede #
# Zeile nach $Namensliste[$s] durchsucht #
# Das müsste sowohl mayer, Mayer aber    #
# auch /mayer /Mayer und .mayer .Mayer   #
# erkennen aber maximal die Zahl nur um  #
# eins erhöhen auch wenn es ein paar mal #
# vorkommt, also i-wie das wenn mehr wie #
# 2 gefunden trotzdem nur $Zahl+1 ist    #
# und nicht jedesmal wenn es was findet  #
##########################################

close(LESEN);}


Danke schon mal im Vorraus.
Nen schönen Tag noch an alle,
mfg stormy
#Kein Kommentar
 2007-11-03 15:40
#101746 #101746
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
Code (perl): (dl )
1
2
3
4
5
6
7
8
my $irgend_eine_dateizeile = "Freund Mayer wohnt in blablabla und blablabla hat die telefonnummer blablabla";

my $suchmuster = "Mayer";

if ($irgend_eine_dateizeile =~ m/$suchmuster/i){
        #ein zähler wird erhöht:
        $Zahl++;
}


der ausdruck
Code: (dl )
$irgend_eine_dateizeile =~ m/$suchmuster/i

sucht in der variable $irgend_eine_dateizeile nach $suchmuster.

das "i" am schluss bedeutet, dass es egal ist ob die Großschreibung übereinstimmt.

wenn der ausdruck in der variable gefunden wurde, wird 1 (TRUE) zurückgegeben, dadurch stimmt die "if"-bedingung und der anweisungsblock in den geschweiften klammern wird ausgeführt.
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
stormy2211
 2007-11-03 15:46
#101748 #101748
User since
2007-11-02
20 Artikel
BenutzerIn
[default_avatar]
Danke, gleich mal reinbauen und ausprobieren. =)
mfg stormy
topeg
 2007-11-03 15:50
#101749 #101749
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
So auch mein Vorschlag:
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
my $Zahl; 
#Die Zahl die erhöht werden soll, sofern in der
#Datei Mayer@München.txt der Namen Mayer vorhanden ist(also im Inhalt)
#kann sein das eventuell auch /Mayer dran steht.

for my $Dateiname (@Verzeichnis)
{
 open(LESEN,"<","C://Freunde/$Dateiname");
 #ist wo für jede Datei deren Inhalt abgespeichert wird
 my @inhalt=<LESEN>;
 # inhalt zusammenfügen:
 my $Data=join(' ', @inhalt);
 for my $Name (@Namensliste)
 { 
  # abfrage starten:
  # finde mit Regexp den Inhalt von "$Name" im String "$Data".
  # "i" heißt arbeite dabei Caseinsensitiv
  # Siege Doku zu Regexp.
  if($Data=~/$Name/i)
  {
   print "$Name in $Dateiname gefunden!\n";
   # alles weiter liegt bei dir :-) 
  }
 } 
 close(LESEN);
}
stormy2211
 2007-11-03 16:04
#101755 #101755
User since
2007-11-02
20 Artikel
BenutzerIn
[default_avatar]
topeg, du bist schon ein fuchs muss ich sagen, packst alles statt Zeile für Zeile zu betrachten in eine Zeile und durchsuchst die eben (Z.10-12) *g*, gefällt mir.
Also ich wäre darauf garantiert nicht gekommen, hehe.
Nen schönen Nachmittag an alle noch,
mfg stormy
renee
 2007-11-03 16:07
#101756 #101756
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
topeg+2007-11-03 14:50:25--

Code (perl): (dl )
1
2
3
4
5
6
7
#...
 open(LESEN,"<","C://Freunde/$Dateiname");
 #ist wo für jede Datei deren Inhalt abgespeichert wird
 my @inhalt=<LESEN>;
 # inhalt zusammenfügen:
 my $Data=join(' ', @inhalt);
}


Wenn Du ein File "slurpen" willst, dann ist das aber umständlich...

Code (perl): (dl )
1
2
# slurpe Inhalt der Datei
my $Data = do{ local (@ARGV,$/) = "C:/Freunde/$Dateiname"; <>};
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/
stormy2211
 2007-11-03 16:09
#101757 #101757
User since
2007-11-02
20 Artikel
BenutzerIn
[default_avatar]
*hust* was ist "slurpen"? wie schon gesagt, arbeite erst jetzt seit 2 Tagen mit Perl bzw. hab vor 2 Tagen mit Programmieren allgemein erst angefangen. =)
mfg stormy
renee
 2007-11-03 16:13
#101759 #101759
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
"slurpen" ist den ganzen Inhalt auf einmal einlesen. Mit dem @lines = <FILEHANDLE>; liest Du ja erst alles in ein Array ein und "klebst" alles mit join zusammen. Das ist unnötig...
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/
topeg
 2007-11-03 16:14
#101760 #101760
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Genau deshalb habe ich nicht diese Konstruktion gewählt, sondern auf etwas schon bekanntes zurück gegriffen :-)

"slurpen" ist eine Umschreibung für "Die ganze Datei in einen String einlesen."

Was bei renees Code genau passiert soll er dir selbst erzählen. Weiß es ja sowieso besser als ich. :-)
renee
 2007-11-03 16:23
#101764 #101764
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
# slurpe Inhalt der Datei
my $Data = do{ local (@ARGV,$/) = "C:/Freunde/$Dateiname"; <>};


mal etwas erläutert:

Du weißt wie Du einfach eine Datei einlesen kannst, die Du als Parameter an das Skript übergeben hast?

Code (perl): (dl )
1
2
3
4
5
6
7
8
#!/usr/bin/perl

use strict;
use warnings;

while( <> ){
    print;
}


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
C:\>more text.txt
hallo
dies
ist ein
test

C:\>skript.pl text.txt
hallo
dies
ist ein
test


So kann man Dateien, die in @ARGV ganz einfach einlesen. Deswegen setze ich ein local @ARGV in dem Snippet. So kann ich den gleichen Effekt nutzen wie in diesem kleinen Skript.

Das andere was ich machen muss ist das Verändern von $/. Was man damit machen kann, habe ich z.B. hier erklärt: http://reneeb-perlblog.blogspot.com/2007/10/ntzlic...

Mehr zu $/ kann man auch in perlvar nachlesen...
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/
<< |< 1 2 3 4 5 ... 7 >| >> 61 Einträge, 7 Seiten



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