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

Zeichenfolge in html Datei, hänge an Dateinamen an

Leser: 1


<< >> 10 Einträge, 1 Seite
hansH
 2007-08-24 23:37
#98633 #98633
User since
2007-08-24
3 Artikel
BenutzerIn
[default_avatar]
Tag zusammen,

ich habe einige tausend html Dateien, je, etwa 30 kb, in denen immer einmal die Zeichenfolge "www id: NNNNN" (ohne Anführungszeichen) enthalten ist. Diese NNNNN sind Zahlen zwischen 100 und 15000. Wie kann ich diese Zahlen an den jeweiligen Dateinamen anhängen?

Der Dateiname lautet "StichwortFFFF.html", wobei das FFFF zwar immer vier Zeichen lang ist, aber alle Buchstaben beinhalten kann. Idealerweise möchte ich dann die jeweils gefundene Zahl anstelle des FFFF einsetzen. Es wäre aber auch schon ausreichend, wenn die Zahl einfach vor oder hinter dem Dateinamen angehängt würde; da kann ich mir dann helfen.

Ob das nun mit Perl zu machen ist, oder sonstwie, ist mir eigentlich egal.

Danke!
Hans
#Kein Kommentar
 2007-08-25 01:28
#98649 #98649
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
da reicht ein ganz einfaches script:

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
use strict;
use warnings;


#Suche alle *.html-dateien:
my @all_files = glob ("*.html");


foreach my $file (@all_files) {

        #Endung entfernen:
        $file =~ s/\.html//;    #Ich weiß es gibt bessere methoden,
                                #mir fällt aber gerade keine ein.

        #Lese die Datei:
        open (FILE, "<", "$file.html") || print "\nERROR: Cannot open the file \"$file\":\n$!\a";
        foreach my $data (<FILE>) {     

                #Wenn die Datei eine bestimmte Zeichenfolge enthält,
                #dann umbenennen:

                if ($data =~ /www id: (\d\d\d\d\d)/) {
                        print "FILE: $1 in \"$file\" gefunden\n";
                        close (FILE);

                        rename ("$file.html", "$file $1.html") || print "\nERROR: Cannot rename the file \"$file\":\n$!\a";
                        last;
                }
        }continue {
                close (FILE);
        }
}


ich weiß das mit dem FFFF ist nicht drin, aber ein bisschen sollst du ja auch
noch tun :-).

schau mal unter substr nach
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
topeg
 2007-08-25 02:24
#98653 #98653
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Habe mal wieder Schlafprobleme:
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
#!/usr/bin/perl

use strict;
use warnings;

my $basepath='./test/';
my $regexp_file=qr'(?<=^Stichwort)\w{4}(?=\.html$)';
my $regexp_search=qr'www id: (\d+)';

opendir(DIR,$basepath) or die "Konnte Verzeichnis $basepath nicht oeffnen ($!)\n";
my @filelist = grep{$_=~/$regexp_file/ and -f $basepath.$_}(readdir(DIR));
closedir(DIR);

for my $filename (@filelist)
{
 print "untersuche $basepath$filename\n";
 unless(open(FILE,'<',$basepath.$filename))
 { print "konnte $basepath.$filename nicht öffnen ($!)\n" }
 else
 {
  my $new_filename=$filename;
  while(my $line=<FILE>)
  {
   if(my($number)=$line=~/$regexp_search/)
   {
    $new_filename=~s/$regexp_file/$number/;
    last;
   }
  }
  close(FILE);
  if($new_filename ne $filename)
  {
   unless(-e $basepath.$new_filename)
   { rename($basepath.$filename,$basepath.$new_filename) or print "Konnte $basepath.$filename nicht zu $basepath.$filename umbenennen ($!)\n" }
   else
   { print "Kann $basepath.$filename nicht zu $basepath.$new_filename umbenennen (Datei mit dem Namen existiert bereits!)\n" }
  }
 }
}
renee
 2007-08-25 12:02
#98657 #98657
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
topeg+2007-08-25 00:24:02--
Habe mal wieder Schlafprobleme:
[...]


Dann geh' zum Arzt ;)


Nee im Ernst, was genau ist Dein Problem?
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-08-25 13:21
#98662 #98662
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Habe mich gestern auf der Arbeit ziemlich geärgert. Da brauchte ich am Abend etwas Ablenkung um wieder runter zu kommen. Da kam mir das ganz recht.
RPerl
 2007-08-25 14:43
#98664 #98664
User since
2006-11-26
384 Artikel
BenutzerIn

user image
lol - das ist ja was. Ich konnte die Nacht auch kein Auge zutun. Bei mir lags an den verdammten Stechmuecken, ich hasse sie *grrrr*
Naja geteiltes Leid ist halbes Leid =)

Sorry fuer offtopic..

gruß,

rPerl
Gast Gast
 2007-08-27 22:43
#98731 #98731
Für die schnelle Hilfe möchte ich ausdrücklich Danke sagen.

Was ich beim ersten Skript falsch mache, weiß ich nicht; beim zweiten hat es mit ein wenig Anpassung funktioniert (ich habe übersehen, daß es natürlich anders ist, wenn man den Suchtext vom Browser mit Copy und Paste einfügt und wenn man das im Quelltext macht. Es hat ein </I> gefehlt...)

Ich wollte dann doch noch die gesuchte Zahlenfolge an den Dateinamen entweder vorne oder hinten anhängen; ich scheitere leider.

$number ist wohl die gesuchte Zahlenfolge; wie muß das jetzt bei rename lauten?

Danke nochmal + schlaflose Nächte sind zwar manchmal ganz schön, aber nicht, wenn von Sorgen verursacht.

Hans
topeg
 2007-08-27 23:31
#98735 #98735
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Alles wichtige steht in den Zeilen:
Code: (dl )
1
2
3
06: my $basepath='./test/';
07: my $regexp_file=qr'(?<=^Stichwort)\w{4}(?=\.html$)';
08: my $regexp_search=qr'www id: (\d+)';

Zeile sechs: Den Pfad zum Ordner er durchgearbeitet werden soll.
Zeile sieben: Der Reguläre Ausdruck der zum finden der Dateien dient und zum ersetzen genutzt wird.
Zeile acht: Der Reguläre Ausdruck, der die Nummer findet, die in den In den Dateinamen eingefügt werden soll.

Wenn ich das richtig verstehe, hast du mit der Zeile sieben Probleme. So wie er jetzt da steht macht er aus "StichwortABCD.html" mit der gesuchten Nummer "1234" "Stichwort1234.html"
Das macht er indem der Ausdruck nach vier Buchstaben sucht, vor denen "Stichwort" und nach denen ".html" steht. Wenn du mir sagst wie du es genau haben willst, dann mache ich dir einen passenden Ausdruck fertig.
Gast Gast
 2007-08-28 09:05
#98743 #98743
Richtig. Ob das nun 1234StichwortABCD.html oder StichwortABCD_1234.html oder Stichwort1234_ABCD.html oder StichwortABCD.html1234 lautet, ist mir ziemlich egal. Bevorzugt wäre StichwortABCD_1234.html, wenn sich das leicht bauen ließe - was ich kaum anzweifle bei Eurem Wissen.

Danke jedenfalls für Eure Hilfe!

Hans
topeg
 2007-08-28 12:34
#98753 #98753
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Der Einfachheit halber poste ich nochmal das angepasste Script:
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
#!/usr/bin/perl

use strict;
use warnings;

my $basepath='./test/';
my $regexp_file=qr'(?<=^Stichwort\w{4})(?=\.html$)';
my $replacestring='_%s';
my $regexp_search=qr'www id: (\d+)';

opendir(DIR,$basepath) or die "Konnte Verzeichnis $basepath nicht oeffnen ($!)\n";
my @filelist = grep{$_=~/$regexp_file/ and -f $basepath.$_}(readdir(DIR));
closedir(DIR);

for my $filename (@filelist)
{
 print "untersuche $basepath$filename\n";
 unless(open(FILE,'<',$basepath.$filename))
 { print "konnte $basepath.$filename nicht öffnen ($!)\n" }
 else
 {
  my $new_filename=$filename;
  while(my $line=<FILE>)
  {
   if(my($number)=$line=~/$regexp_search/)
   {
    $new_filename=~s/$regexp_file/sprintf($replacestring,$number)/e;
    last;
   }
  }
  close(FILE);
  if($new_filename ne $filename)
  {
   unless(-e $basepath.$new_filename)
   { rename($basepath.$filename,$basepath.$new_filename) or print "Konnte $basepath.$filename nicht zu $basepath.$filename umbenennen ($!)\n" }
   else
   { print "Kann $basepath.$filename nicht zu $basepath.$new_filename umbenennen (Datei mit dem Namen existiert bereits!)\n" }
  }
 }
}


die Änderungen sind in den Zeilen 7/8 sowie 27. Ich habe einen String "$replacestring" hinzu gefügt, über den der in den Dateinamen einzufügende String erzeugt wird.
<< >> 10 Einträge, 1 Seite



View all threads created 2007-08-24 23:37.