Thread nicht ganz so einfach Stringmanipulation (6 answers)
Opened by errorsmith at 2015-01-06 10:35

Gast errorsmith
 2015-01-06 10:35
#179071 #179071
Hi



Ich schreibe ein Skript das vorhandene Dateien Zeile für Zeile ausliest, den enthaltenen Text auf Dateien / Dateipfade prüft und dann die Existenz der referenzierten Dateien kontrolliert. Ist die Datei nicht vorhanden, wird eine Info ausgegeben.

Aus den Dateien extrahiere ich Zeilenweise Strings die so aussehen können:

Code: (dl )
1
2
3
soundSet = { name = "bus_modern", horn = "vehicle/truck_modern/horn.wav" }
id = "vehicle/bus/citaro/lod_0_w2.msh",
"vehicle/bus/berkhof_duvedec/berkhof_duvedec_lod_0_w2.msh", "vehicle/bus/berkhof_duvedec/berkhof_duvedec_lod_0_w3.msh",


Ich muss also die Dateipfade irgendwie aus den Strings extrahieren. Mein Ansatz sieht bisher so aus, das ich alle Whitespace-Zeichen entferne und dann mittels regex die Zeichen zwischen den "" extrahiert habe. Das funktioniert allerdings im 3. Beispiel nicht, da dort zwei Dateien referenziert sind. Ebenso wenig im 1. Beispiel, da steht die Referenz auf die Datei erst im zweiten Abschnitt des Strings. Nun stehe ich ein wenig auf dem Schlauch, kann mich da bitte mal in die Richtige Richtung schubsen?

Mein bisher ziemlich schlecht Code für den fraglichen Abschnitt sieht so aus:

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
open $filehandle, "<", $file or die "can't open $file\n";
while (<$filehandle>)
{  
my $line=$_;
my $count=0;
$count++ while ($line =~ m/\//g);
            # looks like we found a file-reference
            if ( $count > 1) 
            { 
                # remove all whitespace now

                # prefix whitespace
                $line =~ s/^\s+//;

                # suffix whitespace
                $line =~ ~ s/\s+$//;

                # intermediate whitespace
                $line=~ s/ //g;

                # remove everything until first occurance of "
                $line=~ s/[^\"]*\"//;

                # chop off all chars after "
                my $oper = index($line, '"');
                my $word = substr($line, 0, $oper);
                $line=$word;

                # putting it together
                # buildpath returns a complete path & filename depending on wich prefix is 
                # used for the current file

                my $searchfile=buildpath($line);
                if ( -e $searchfile )
                {
                    pdebug(1,"found\n");
                }
                else
                {
                    pdebug(1,"not found\n");
                    print "\nunmatched reference in file:\n$file\n";
                    # findline prints the Linenumber of a string in a file
                    findline($file,$line);
                    print"\ncouldn't find file:\n       $searchfile\nreferenced as:\n$line\n";

                }
            }
}


Erklärung zu den genutzen subds:
"buildpath" ordnet die jeweilige Dateiendung einem Verzeichnis zu, so liegen .tga Dateien in textures, .wav Dateien in audio/effects und so weiter.
"findline" liest die gegebene Datei zweilenweise ein und gibt die Zeilennummer eines Strings aus sofern er gefunden wurde
"pdebug" nimmt als ersten Parameter das "debuglevel", als zweiten Text den auszugebenden Text. Es gibt den Text aus wenn debuglevel >= dem ersten Parameter ist.



Grüße,
errorsmith
Last edited: 2015-01-06 11:13:44 +0100 (CET)

View full thread nicht ganz so einfach Stringmanipulation