kame-hame-ha
Goto Top

Routine zum suchen von von Dateien und speichern deren Namen sowie Werte als Variablen für die weitere Verwendung

Hallo allerseits,
habe mich heue extra registriert, weil ich einfach nicht schnell genug weiterkomme.  Bis jetzt konnte ich mit Hilfe der geposteten Beiträge mich sehr gut voran bewegen. Nun stehe ich vor einem Problem. Ich benötige ein VBS oder Batch Script für die folgende Aufgabe, am besten an einem Beispiel zu erläutern:
es gibt einen Verzeichnis D:\TXT. Hier liegen fünf txt-files
000111_D.txt
000113_C.txt
000234_A.txt
000456_B.txt
000832_A.txt
Der Inhalt dieser Dateien ist ein Wert, z.B. i.O oder n.i.O

In einem anderen Verzeichnis D:\XML liegen fünf xml-files:
000111_A_Part1.xml
000113_C_Part2.xml
000234_A_Product1.xml
000456_B_Product2.xml
000832_A_Part1.xml

Diese XML-Dateien beinhalten irgendwo einen Eintrag
<UserValue value="n.d." title="test_result"></UserValue>

Ich habe als Einstieg einen VBScript geschrieben, der eine festgelegte XML nach diesem Eintrag druchsucht und den Wert bei value=”n.d“ durch einen festgelegten Wert ersetzt.

'Variablen initialisieren  
Dim oldvalue 
Dim newvalue 
Dim newcontent
Dim content

'Variablen setzen  
oldvalue = "value=" & _  
		Chr(34) & "n.d." & Chr(34) & _   
		" " & _  
		"title=" & _  
		Chr(34) & "test_result" & Chr(34)  

newvalue = "value=" & _  
		Chr(34) & "i.o." & Chr(34) & _   
		" " & _  
		"title=" & _  
		Chr(34) & "test_result" & Chr(34)  

'Datei öffnen und auslesen  
Set FSO = CreateObject("Scripting.FileSystemObject")  
Set File = FSO.OpenTextFile("D:\XML\000093_A_Part1.xml", 1)  
content = File.ReadAll
File.Close

'String finden und ersetzen  
newcontent= Replace(content, oldvalue , newvalue)


'In Datei schreiben  
Set File = FSO.OpenTextFile("D:\XML\000093_A_Part1.xml", 2)  
File.Write newcontent 
File.Close

Das Ziel ist es aber, dass ein Script in das Verzeichnis D:\TXT geht, die erste Datei öffnet und sich den Namen der Datei und den Inhalt (also als Variablen) merkt . Dann geht er in das D:\XML Verzeichnis, sucht eine XML, die den gleichen Namen (bzw. die ersten 8 Stellen sind identisch) hat wie die entsprechende txt-datei, und schreibt den gespeicherten Wert in das value=““ .
Das Script wird solange ausgeführt, bis er alle txt-dateien abgearbeitet hat.
Vielleicht hat einer von euch eine Idee, bin für jede Lösung dankbar.

Content-Key: 183565

Url: https://administrator.de/contentid/183565

Printed on: April 19, 2024 at 22:04 o'clock

Member: Kame-hame-ha
Kame-hame-ha Apr 17, 2012 at 12:09:43 (UTC)
Goto Top
Hmm, schade, dass sich niemand gemeldet hat...
Member: Biber
Biber Apr 17, 2012 at 12:14:27 (UTC)
Goto Top
Zitat von @Kame-hame-ha:
Hmm, schade, dass sich niemand gemeldet hat...
Hmmm, warte doch noch einen Moment - heute war doch wieder bis 13:30h Streiktag bei der ver.di und es sind bestimmt noch nicht alle zurück vom Marktplatz.
Member: bastla
bastla Apr 17, 2012 at 14:45:25 (UTC)
Goto Top
Hallo Kame-hame-ha und ein etwas verspätetes Willkommen im Forum, hallo Biber!

Vor lauter Arbeit war ich noch nicht mal zum Streiken gekommen ... face-wink
Verstehe ich das richtig, dass die XML-Dateien nach dem sich aus der Textdatei ergebenden Beginn des Namens noch einen nicht bekannte Zusatz (wie "_Part1") enthalten?

Grüße
bastla
Member: Kame-hame-ha
Kame-hame-ha Apr 17, 2012 at 14:54:54 (UTC)
Goto Top
Hallo Biber und bastla,

freut mich, dass ihr euch gemeldet habt. Bei uns auf Arbeit hat nur das Internet gestreikt, das würde ich aber nicht auf ver.di schieben face-smile

Ja, das stimmt. Die XML-Datein sind exportierte Objekte aus der Datenbank, ihre Benennung kann man nicht ändern. Aber die Namen der korrespondierenden Dateien wären, wie hier im Beispiel, bei den ersten 8 Zeichen identisch.
Member: bastla
bastla Apr 17, 2012 at 15:28:47 (UTC)
Goto Top
Hallo Kame-hame-ha!

Dann brauchst Du 2 Schleifen - die erste, um alle Textdateien durchzuackern, und die zweite, um aus allen XML-Dateien die richtige herauszusuchen - ungetestet etwa so:
TXTOrdner = "D:\TXT"  
XMLOrdner = "D:\XML"  
Alt = "<UserValue value=""n.d."" title=""test_result""></UserValue>"  

Set fso = CreateObject("Scripting.FileSystemObject")  

For Each TXT In fso.GetFolder(TXTOrdner).Files 'alle Textdateien durchgehen  
    TXTInhalt = TXT.OpenAsTextStream.ReadLine 'erste Zeile der Datei einlesen  
    Neu = Replace(Alt, "n.d.", TXTInhalt) 'gelesenen Wert in den Ersatz-String einbauen  
    TXTName = LCase(fso.GetBaseName(TXT.Name)) 'Dateinamen ohne Typ in Kleinbuchstaben erzeugen  
    LName = Len(TXTName) 'Länge des Namens nur einmal, daher vor der Schleife, ermitteln  
    For Each XML In fso.GetFolder(XMLDateien).Files 'alle XML-Dateien durchgehen  
        If LCase(Left(XML.Name, LName)) = TXTName Then 'Wenn der Anfang des Dateinamens mit dem Namen der Textdatei übereinstimmt ...  
            XMLInhalt = XML.OpenAsTextStream.ReadAll '... Dateiinhalt auslesen und ...  
            fso.CreateTextFile(XML.Path).Write Replace(XMLInhalt, Alt, Neu) '... mit ersetztem Text neue Datei erzeugen  
            Exit For 'Fertig - übrige XML-Dateien interessieren nicht mehr  
        End If
    Next
Next
Grüße
bastla

[Edit] Zeile 13 - hoffentlich - richtig gestellt [/Edit]
Member: Kame-hame-ha
Kame-hame-ha Apr 17, 2012 at 16:00:10 (UTC)
Goto Top
danke bastla!

Hab's getestet, läuft noch nicht face-smile. Aber das ist erstmal kein Problem. Jetzt habe ich einen Ansatz und kann darin basteln! Wenn ich es hinbekommen habe, dann poste ich das fertige Script hier rein, ansonsten werde mich hilferufend nochmal melden !

Schöne Grüße


Kame-hame-ha
Member: Kame-hame-ha
Kame-hame-ha Apr 17, 2012 at 16:03:36 (UTC)
Goto Top
Achso, was ich noch sagen wollte, das Script siehr so einfach aus...genial!
Member: Kame-hame-ha
Kame-hame-ha Apr 17, 2012 at 16:32:21 (UTC)
Goto Top
Geil! Funktioniert!

An der Zeile 13 lag's und an der Zeile 12 statt XMLDateien, muss "XMLOrdner" stehen also hier nochmal das Script:

TXTOrdner = "D:\TXT"  
XMLOrdner = "D:\XML"  
Alt = "<UserValue value=""n.d."" title=""test_result""></UserValue>"  

Set fso = CreateObject("Scripting.FileSystemObject")  

For Each TXT In fso.GetFolder(TXTOrdner).Files 'alle Textdateien durchgehen  
    TXTInhalt = TXT.OpenAsTextStream.ReadLine 'erste Zeile der Datei einlesen  
    Neu = Replace(Alt, "n.d.", TXTInhalt) 'gelesenen Wert in den Ersatz-String einbauen  
	MsgBox Neu
    TXTName = LCase(fso.GetBaseName(TXT.Name)) 'Dateinamen ohne Typ in Kleinbuchstaben erzeugen  
    LName = Len(TXTName) 'Länge des Namens nur einmal, daher vor der Schleife, ermitteln  
    For Each XML In fso.GetFolder(XMLOrdner).Files 'alle XML-Dateien durchgehen  
        If LCase(Left(XML.Name, LName)) = TXTName Then 'Wenn der Anfang des Dateinamens mit dem Namen der Textdatei übereinstimmt ...  
            XMLInhalt = XML.OpenAsTextStream.ReadAll '... Dateiinhalt auslesen und ...  
            fso.CreateTextFile(XML.Path).Write Replace(XMLInhalt, Alt, Neu) '... mit ersetztem Text neue Datei erzeugen  
            Exit For 'Fertig - übrige XML-Dateien interessieren nicht mehr  
        End If
    Next
Next

Danke nochmal vielmals! Super gelöst!
Member: bastla
bastla Apr 17, 2012 at 17:13:53 (UTC)
Goto Top
Hallo Kame-hame-ha!

Sorry - hab' das nur so auf die Schnelle hingeschrieben (Zeile 13 war mir dann aber wenigstens selbst noch aufgefallen) ...
Noch ein Tipp: Anstelle von
MsgBox Neu
kannst Du auch
WScript.Echo Neu
verwenden - Vorteil: Wenn Du aus einer CMD-Shell mit
cscript Script.vbs
testest, brauchst Du nicht jede Ausgbae mit OK zu bestätigen (und bei defaultmäßiger Ausführung über "wscript" wird trotzdem eine MsgBox verwendet) ...

Grüße
bastla