fraenky
Goto Top

In Linkstruktur Sonderzeichen mit VB transformieren.

Die bestehende Linkstruktur an bestehende Linkkonventionen bezüglich Sonderzeichen anpassen.

Hallo zusammen.
In diesem Schritt sollen jetzt also die Links, die auf die im vorigen Schritt umbenannten Dateien verweisen, mit Hilfe der im vorigen Script erstellten Umwandlungstabelle von Sonderzeichen befreit werden.
Zu anderen Zwecken hatte ich schon alle Texte, die auf diese jetzt frisch umbenannten Übersetzungsdateien verweisen, in einem einzigen Dokument zusammengefaßt, das Wir jetzt hier gut verwenden können, um die Aktion durchzuführen.
Festzuhalten ist, das Wir zwei verschiedene Arten von Text haben.
Einmal Text, in dem Sonderzeichen erlaubt sind. Das sind normaler Text und der Linktext, also der Text, auf den geklickt wird.
Nicht erlaubt sind Sonderzeichen in der Ordnerstruktur des Links sowie in der angelinkten Datei.
Also muß das Script nur die Bereiche bearbeiten, die den Link enthalten.
Desweiteren sollte das Script einen Arrey bereitstellen, in dem ich die nicht mit der Umwandlungstabelle erstellten Modifizierungen der Dateinamen bekannt machen kann nach folgendem Schema: Dateiname-mit-Sonderzeichen = Neuer-Dateiname-Manuell-erstellt, Dateiname2-mit-Sonderzeichen = Neuer-Dateiname2-Manuell-erstellt usw.
Dieses Arrey soll also alle Dateinamen enthalten, die von mir wegen der Dopplungsgefahr manuell umbenannt wurden.
Das Script soll also den Teil des Links(wenn ein Sonderzeichen enthalten ist), der die angelinkte Datei anspricht(im unteren Beispiel DateinamePerd%E3o), zuerst in dem Arrey mit dem Dateinamen links des = vergleichen. Wenn Treffer, mit dem rechten Teil des = ersetzen. Wenn kein Treffer, mit Hilfe der Umwandlungstabelle ersetzen.
Zuerst muß aber der linke Teil vom = im Arrey mit der schon entwickelten Sonderfunktion Konvert in html Sonderzeichendarstellung umgewandelt werden, damit der Vergleich funktionieren kann.
Wegen der geringen Anzahl der Ausnahmen kann ich aber die Dateinamen links des = im Arrey auch manuell im html Format angeben.
Falls im Pfad, also nicht in der angelinkten Datei, ein Sonderzeichen gefunden und ersetzt wird, soll dieser in eine Protokolldatei geschrieben werden, damit ich ihn manuell in meiner Ordnerstruktur anpassen kann.
Struktur der Links:
<a title="Titel"href="Pfad/DateinamePerd%E3o.php">Linktext</a>
Also sollen alle Operationen zwischen <a und <a/> durchgeführt werden.
Den Start stelle ich mir so vor, das, wie im vorigen Script, ich die Datei mit dem Text auf das Script ziehe, was ja viel komvortabler als der Aufruf über die Kommandozeile ist.
Wenn ich hier wieder fachmänische Hilfe finde, bringt mich das den letzten großen Schritt bezüglich der Sonderzeichenproblematik weiter.
Dank und Gruß
Fraenky

Content-ID: 73217

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

Ausgedruckt am: 22.11.2024 um 16:11 Uhr

Fraenky
Fraenky 13.11.2007 um 12:53:44 Uhr
Goto Top
Hallo bastla.
Ok. Ich sehe es ein. Ohne Dich läuft hier in der Rubrik gar nichts mehr. Sorry.
Es währe wirklich sehr freundlich von Dir, wenn Du mit Deinem großen Wissen, das Du in 30 Jahren erworben hast, Uns auf so tolle, effiziente Art und Weise weiterhelfen könntest. Und weil ich ja weiß, das Du auf vielen Baustellen hilfreich zur Seite stehst, habe ich die Aufgabenstellung noch mal überdacht und eine Minimalanforderung entwickelt.
1. Die Überprüfung des Pfades auf Sonderzeichen kann wegfallen.
2. Das Arrey zur Bekanntmachung der manuell umbenannten Dateinamen kann notfalls auch wegfallen. Dann muß ich über Suchen und Ersetzen die Links finden, die auf die ca 20 manuell umnenannten Übersetzungsdateien verweisen und diese ändern.
Der Hauptteil der Arbeit währe dann immer noch vom Script geleistet.
Und weiter währe es doch schön, wenn der folgende Vierzeiler sich wieder mal bewahrheiten würde:
Hast Du Probleme am PC
Komm nach administrator.de
Du brauchst nicht mehr zu laufen
Hier werden Sie geholfen.
Gruß
Fraenky
bastla
bastla 13.11.2007 um 14:16:14 Uhr
Goto Top
Hallo Fraenky!

Das trifft sich gut - habe kürzlich eine Baustelle abgeschlossen ... face-wink
1. Die Überprüfung des Pfades auf Sonderzeichen kann wegfallen.
Hier hätte ich eine manuelle Ersetzung vorweg vorgeschlagen (sowohl in den Ordnernamen des Dateisystems als auch im HTML-Dokument - in letzterem einfach per "Suchen/Ersetzen", da die Angabe des gesamten Pfades (alt und neu) - und damit eines langen Suchbegriffes - dafür sorgen sollte, dass tatsächlich nur der betreffende Pfad verändert wird und keine unerwünschten Ersetzungen in Dateinamen oder Texten stattfinden).

2. Das Array zur Bekanntmachung der manuell umbenannten Dateinamen kann notfalls auch wegfallen.
Schau'n mer mal ...
Noch zwei Fragen:
... in einem einzigen Dokument ...
Ist dieses Dokument als Linkliste strukturiert (ein Link je Zeile) oder kann zumindest davon ausgegangen werden, dass eine zeilenweise Bearbeitung möglich ist (da keine - im Quellcode - zeilenübergreifenden Links vorkommen)?

Also sollen alle Operationen zwischen <a und <a/> durchgeführt werden
Ich hätte eigentlich angenommen, dass nur die Dateinamen (oder ev -pfade) betroffen wären und daher nur den Bereich zwischen href=" und dem nächsten Anführungszeichen als relevant erachtet - oder sollten doch auch Titel und Linktext geändert werden?

Grüße
bastla
Fraenky
Fraenky 13.11.2007 um 23:34:38 Uhr
Goto Top
Hallo bastla.
Schön, das Du wieder hier bist.
Das angesprochene Dokument kannst Du Dir als Liedtextsammlung vorstellen, die im zeilenweisen Wechsel zwischen zwei Sprachen vorliegt.
Die Links auf die weiter ausführenden Übersetzungsdateien(also auf die Dateien, die neu umbenannt wurden) können also beliebig auftauchen. Zwei, drei hintereinander in einer Zeile oder auch zeilenübergreifend.
Also vielleicht am besten in der nächsten Zeile nach dem Endmerkmal suchen(falls es nicht in der monentanen auftaucht), um den Arbeitsbereich zu separieren.
Mit <a </a> wollte ich den maximalen Einsatzbereich aufzeigen. Du mit dem klaren Blick des erfahrenen Programierers hast diesen genauer eingegrenzt, also zwischen href " und ".
Ein Sahnehäubchen währe es, wo Wir hier gerade sind, face-smile wenn das Script überprüfen würde, ob es Wörter in der Liedtextsammlung gibt, die dem Linktext entsprechen und nicht zwischen <a </a> und auch nicht zwischen <div class="silber"> und </div>(deutsche Übersetzung, für den Fall, das Wörter in beiden Sprachen existieren) stehen.
Dann müßte das Script die Linktexte zuerst bearbeiten, die die meisten Wörter beinhalten, damit nicht ein einzelnes Wort das mehrteilige verhindern kann, weil es schon verlinkt wurde.
Dank und Gruß
Fraenky
bastla
bastla 15.11.2007 um 02:09:35 Uhr
Goto Top
Hallo Fraenky!

Für den folgenden Script-Entwurf werden die "SonderzeichenErsetzung.txt" aus dem vorherigen Schritt benötigt sowie eine "Ausnahmen.txt" zur Zuordnung der manuell zu ersetzenden Dateinamen nach folgendem Schema berücksichtigt:
alter Dateiname=neuer Dateiname
Zwischen dem jeweiligen Dateinamen und dem "=" darf kein Leerzeichen stehen. Die Schreibweise des alten Dateinamens muss dabei der bereits im Dokument verwendeten entsprechen (es erfolgt vor der Ersetzung keine Konvertierung) und es wird ein davor stehender Pfad (mit "/" getrennt) sowie die Angabe des Dateityps (zB ".php") vorausgesetzt.

Falls keine oder eine leere "Ausnahmen.txt" vorgefunden wird, ist zu entscheiden, ob dennoch die Konvertierung (dann eben ausnahmslos aller Dateinamen und Pfade) erfolgen oder das Script abgebrochen werden soll.

Da auch in den Pfaden enthaltene Sonderzeichen umgewandelt würden, sollten diese bereits im Vorhinein per Suchen/Ersetzen behandelt worden sein.

Const sSonder = "C:\Skripts\SonderzeichenErsetzung.txt"  
Const sAusnahmen = "C:\Skripts\Ausnahmen.txt"  

Const sFileExtOld = ".bak"  

Const sStart = "href=""" 'linke Begrenzung der zu konvertierenden Sequenz  
Const sEnd = """" 'rechte Begrenzung der zu konvertierenden Sequenz  

lLenStart = Len(sStart)

If WScript.Arguments.Count = 0 Then
	WScript.Echo "Datei mit umzubenennenden Links als Parameter uebergeben!"  
	WScript.Quit(1)
End If

Set fso = CreateObject("Scripting.FileSystemObject")  
sFile = WScript.Arguments(0)

If Not fso.FileExists(sFile) Then
	WScript.Echo sFile & " ist kein gueltiger Dateiname!"  
	WScript.Quit(1)
End If

If Not fso.FileExists(sSonder) Then
	WScript.Echo "Sonderzeichendaten " & sSonder & " nicht gefunden."  
	WScript.Quit(1)
End If
Set oSonder = fso.OpenTextFile(sSonder, 1)
If Not oSonder.AtEndOfStream Then 
	aSonder = Split(oSonder.ReadAll, vbCrLF)
Else
	oSonder.Close
	WScript.Echo "Sonderzeichendatei " & sSonder & " enthält keine Daten!"  
	WScript.Quit(1)
End If
oSonder.Close

If Not fso.FileExists(sAusnahmen) Then
	R = MsgBox("Ausnahmendatei " & sAusnahmen & " nicht gefunden!" & vbCrLF & vbCrLF & _  
		"Sollen alle Links (ohne Ausnahmen) umgewandelt werden?",vbYesNo)  
	If R <> vbYes Then WScript.Quit(1)
	bAusnahmen = False
Else
	Set oAusnahmen = fso.OpenTextFile(sAusnahmen, 1)
	If Not oAusnahmen.AtEndOfStream Then 
		aAusnahmen = Split(oAusnahmen.ReadAll, vbCrLF)
		bAusnahmen = True
	Else
		R = MsgBox("Ausnahmendatei " & sAusnahmen & " enthält keine Daten!" & vbCrLF & vbCrLF & _  
		"Sollen alle Links (ohne Ausnahmen) umgewandelt werden?",vbYesNo)  
		If R <> vbYes Then WScript.Quit(1)
		bAusnahmen = False
	End If
	oAusnahmen.Close

End If

sFileBak = sFile & sFileExtOld
If fso.FileExists(sFileBak) Then fso.DeleteFile(sFileBak)
Set oFile = fso.GetFile(sFile)
oFile.Name = sFileBak
sText = oFile.OpenAsTextStream(1).ReadAll
Set oFile = Nothing

Set oFileNew = fso.OpenTextFile(sFile, 2, True)

bDone = False
lEnd = 0
lPos2Write = 1
Do
	lStart = InStr(lEnd + 1, sText, sStart, vBTextCompare)
	If lStart > 0 Then
		lStart = lStart + lLenStart
		oFileNew.Write Mid(sText, lPos2Write, lStart - lPos2Write)
		lPos2Write = lStart
		lEnd = InStr(lStart, sText, sEnd, vBTextCompare)
		If lEnd > 0 Then
			sLinkOld = Mid(sText, lStart, lEnd - lStart)
			sLinkNew = ReplaceSpecialChars(sLinkOld, bAusnahmen)
			oFileNew.Write sLinkNew
			lPos2Write = lEnd
		Else
			bDone = True
		End If
	Else
		bDone = True
	End If
Loop  Until bDone

oFileNew.Write Mid(sText, lPos2Write)
oFileNew.Close

Function ReplaceSpecialChars(sOld, bAus)
sTemp = sOld
If bAus Then
	For Each sLine In aAusnahmen
		aAus = Split(sLine, "=")  
		If InStr(sOld, "/" & aAus(0)) <> 0 Then  
			sTemp = Replace(sOld, "/" & aAus(0), "/" & aAus(1))  
			Exit For
		End If
	Next
End If

If sTemp = sOld Then
	For Each sLine In aSonder
		aChars = Split(sLine, ",")  
		For i = 1 To UBound(aChars)
			sTemp = Replace(sTemp, aChars(i), aChars(0))
		Next
	Next
End If
ReplaceSpecialChars = sTemp
End Function
Von der bearbeiteten Datei wird eine Sicherungskopie (mit der zusätzlichen Endung ".bak") erstellt.

Grüße
bastla
Biber
Biber 15.11.2007 um 03:27:33 Uhr
Goto Top
@bastla

Es muss aber wirklich nicht sein, dass Du um diese Zeit noch am Skripten bist.
Oder am Kommentare verfassen in dubiosen Foren....
Mach ich ja auch nicht.

Morgen ist auch noch ein Tag..

face-wink

Grüße
Biber
bastla
bastla 15.11.2007 um 07:26:16 Uhr
Goto Top
@Biber
Oder am Kommentare verfassen in dubiosen Foren....
Woher weißt Du von den dubiosen Foren?

... um diese Zeit noch am Skripten bist.
Mach ich ja auch nicht.
Nee, is klar, bei Dir ist's ja auch eine ganz andere Zeit - und vermutlich hast Du auch nur gebatcht ... face-wink

Jedenfalls schaut's so aus, als müssten wir beide uns wenigstens nicht um Schlafzimmerschranken kümmern ...

Grüße und guten Morgen
bastla
Fraenky
Fraenky 15.11.2007 um 15:18:53 Uhr
Goto Top
Hallo bastla.
Habe bei Scriptausführung leider folgenden Fehlercode erhalten:

Zeile 61
Ungültiger Prozeduraufruf oder ungültiges Argument
Code 800A0005
Laufzeitfehler in MS VBS

Gruß
Fraenky
bastla
bastla 15.11.2007 um 17:12:13 Uhr
Goto Top
Hallo Fraenky!

Ändere bitte die Zeile 61 von
oFile.Name = sFileBak
auf
oFile.Name = oFile.Name & sFileExtOld

Grüße
bastla
Fraenky
Fraenky 15.11.2007 um 18:10:05 Uhr
Goto Top
Hallo bastla.
Es geht vorwärts. Hier eine weitere Fehlermeldung:

Zeile 98
Zeichen 3
Index außerhalb des gültigen Bereichs: "[number:0 ]"
Code 800A0009
Laufzeitfehler in MS VBS

Grüße
Fraenky
bastla
bastla 15.11.2007 um 18:20:07 Uhr
Goto Top
Hallo Fraenky!

Entweder entfernst Du die in Deiner "Ausnahmen.txt" (vermutlich am Ende) befindliche(n) Leerzeile(n), oder (besser: und) Du änderst den Teil
If bAus Then
	For Each sLine In aAusnahmen
		aAus = Split(sLine, "=")  
		If InStr(sOld, "/" & aAus(0)) <> 0 Then  
			sTemp = Replace(sOld, "/" & aAus(0), "/" & aAus(1))  
			Exit For
		End If
	Next
End If
auf
If bAus Then
	For Each sLine In aAusnahmen
		If sLine <> "" Then  
			aAus = Split(sLine, "=")  
			If InStr(sOld, "/" & aAus(0)) <> 0 Then  
				sTemp = Replace(sOld, "/" & aAus(0), "/" & aAus(1))  
				Exit For
			End If
		End If
	Next
End If

Grüße
bastla
Fraenky
Fraenky 16.11.2007 um 00:44:47 Uhr
Goto Top
Hallo bastla.
Auch ohne Häubchen erste Sahne.
Scheint ein sehr rechenintensiver Prozess gewesen zu sein, hat einige Zeit gedauert.
Das Script ist problemlos Durchgelaufen und Stichproben sehen auch vielversprechend aus.
Super Arbeit bastla, auch die Fehleridentifizierung.

Hast Du Probleme am PC
Komm nach administrator.de
Du brauchst nicht mehr zu laufen
Hier werden Sie geholfen.

Willst Du dann zu den Sprachen,
Dann mußt Du nicht nach Aachen.
Mußt nur den bastla finden
Schon die Probleme schwinden.

Dank und Gruß
Fraenky