Schrift
[thread]12039[/thread]

Files nach bestimmten Schema schreiben



<< >> 5 Einträge, 1 Seite
Gast Gast
 2008-06-18 14:15
#111185 #111185
Guten Tag,
bin gerade dabei ein Script von mir zuerweitern und bin leider gerade an nen Problem gestoßen, wo ich nicht weiß woran es liegen könnte.

Erstmal ne kleine Erklärung.

Es gibt einen Ordner "search". In diesem Ordner befindet sich ein Unterordner Namens "1".
Soweit sogut.
Jetzt lese ich Dateien in ein Array ein.
Die dateien sollen dann solange in den Ordner "1" geschrieben werden, bis im ordner "1" 5 Dateien gefunden werden.
Danach soll ein weiterer Ordner (Ordner + 1 , also hier dann Ordner 2) erstellt werden.Nach der 1 wäre es halt die 2.
Der wird dann wieder bis 5 gefüllt usw. usw.

Hier mal das Script. habs erstmal OHNE "use strict" gemacht:

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
$komma = rand(9999999);
$random = int($komma);

if (!-d "search/1")
{
mkdir("search/1");
}


$count = 0;
foreach $file (@found)
{
$count++;
}



$foreach = 0;
foreach $aa (@found)
{
        $foreach++;
        $ordnercount = 0;
                foreach $ordner ("search/*")
                {
                        $ordnercount++;
                }
                        $dateicount = 0;
                                foreach $datei ("search/$ordnercount/*.txt")
                                {
                                        $dateicount++;
                                }
                                        if ($dateicount =~ 5)
                                        {
                                                $ordnercount++;
                                                mkdir("search/$ordnercount");
                                                open(DATA,'>',"search/$ordnercount/$random.txt")|| print "FEHLER $!";
                                                print DATA "FILE";
                                                close(DATA);
                                        }
                                        else
                                        {
                                                open(DATA,'>',"search/$ordnercount/$random.txt")|| print "FEHLER $!";
                                                print DATA "FILE";
                                                close(DATA);
                                        }
                                
                                
                                
}       


Die Variablen zeigen NACH der Funktion das an.
Das Array besaß 10 Dateien:


ordner : 1 (ordner in "search". Bei 10 einträgen sollte hier NORMAL ne 2 stehen )
dateien : 1 (Dateien die geschrieben wurden. Sollte auch NORMAL 10 sein )
foreach : 10 (Durchläufe der foreach schleife. 10 einträge = 10 foreach, STIMMT aber wieso dann NUR 1 Ordner & 1 Datei ??

MFG

//MODEDIT: Ein Titel ohne gebrülltes HELP hätte gereicht; Titel geändert
renee
 2008-06-18 15:04
#111189 #111189
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Abgesehen davon, dass das Ganze etwas umständlich ist:

Du gehst wohl davon aus, dass ("search/$ordnercount/*.txt") einen glob macht, macht es aber nicht. Das ist ein ganz normaler String. Mehr zu glob: perldoc -f glob
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/
Gast Gast
 2008-06-18 23:29
#111248 #111248
Ups, hat ich wohl vergessen das glob zusetzten :( Is ja peinlich...

Ehm , ich habs mal verbessert. Aber das Problem besteht immernoch. Er schreibt NUR 1mal :(

Hier der jetzige Testcode:

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
#!/usr/bin/perl

$komma = rand(9999999);
$random = int($komma);

foreach $file (glob("files/*.txt"))
{
push(@found,$file);
}


if (!-d "suche/1")
{
mkdir("suche/1");
}


foreach $found (@found)
{
        $dir = 0;
        foreach $a (glob("suche/*"))
        {
                $dir++;
        }
                $files = 0;
                foreach $b (glob("suche/$dir/*.txt"))
                {
                        $files++;
                }
                        if ($files =~ 5)
                        {
                                $dir++;
                                mkdir("suche/$dir");
                                open(WRITE,'>',"suche/$dir/$random.txt") or die "Fehler $!";
                                print WRITE "TESTFILE";
                                close (WRITE);
                        }
                        else
                        {
                                open(WRITE,'>',"suche/$dir/$random.txt") or die "Fehler $!";
                                print WRITE "TESTFILE";
                                close (WRITE);
                        }


}



print "Found : ","@found","\n";
print "Ordner : ","$dir","\n";
print "Datei : ","$files","\n";


@renee : Wie würdest du es lösen? Ich meine weil du meintest das es "umständlich" ist.

Mit freundlichem Gruß
renee
 2008-06-19 01:39
#111249 #111249
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du arbeitest mit Schleifen, wo keine Schleife notwendig ist. Beispiel:

Code (perl): (dl )
1
2
3
4
foreach $file (glob("files/*.txt"))
{
push(@found,$file);
}


Warum nicht einfach
Code (perl): (dl )
my @found = glob "files/*.txt";
?

Was Dein Fehler ist: Du berechnest nur ein einziges Mal die Zufallszahl $random. Dadurch beschreibst Du immer wieder die selbe Datei. Dadurch wird keine neue Datei erstellt und so bleibst Du immer bei genau einer neuen Datei!!

Warum verwendest Du so viele globs? Gibt es andere Programme, die die Dateien/Verzeichnisse erstellen können?

Wenn dieses Programm das einzige Programm ist, was an den Dateien und Verzeichnissen arbeitet, dann würde ich das so (ungefähr) machen:

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
#!/usr/bin/perl

use strict;
use warnings;

my @files = glob "files/*.txt";

my $counter = 0;
my $dir = 1;

for my $file ( @files ){
    if( $counter++ % 5 == 0 ){
        $dir++;
    }

    mkdir "suche/$dir" unless -e "suche/$dir";
    my $random = int rand 999999;

    open my $fh, '>', "suche/$dir/$random$file" or die $!;
    print $fh "DATEI";
    close $fh;
}
(ungetestet)
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/
Gast Gast
 2008-06-19 01:52
#111250 #111250
Vielen vielen Dank, endlich funktioniert es :-)
Kehr hät ich auch selber drauf kommen können ...

@ renee : Jap, die Dateien werden von mehreren Scripts benutzt. Deshalb muss ich immerwieder neu auslesen lassen.

Mit freundlichem Gruß
<< >> 5 Einträge, 1 Seite



View all threads created 2008-06-18 14:15.