fraenky
Goto Top

Mit VB Script eine Linkliste alphabethisch ordnen lassen.

Ich möchte mit einem VB Script eine über 3000 Links umfassende Liste bereinigen und sortieren lassen.

Das Script sollte zwischen groß- kleinschreibung unterscheiden können und auch den Umgang mit allen Sonderzeichen beherrschen. Die Liste steht einfach zeilenweise untereinander und sollte aufsteigend sortiert werden und ist in html geschrieben. Kann mir hier jemand weiterhelfen. Ein einfaches Script ist willkommen, damit ich meine Fertigkeiten in VB aufbauen kann. Danke Fränky
Edit 27.08.07 10:21
Was Sie als Anfänger in VBS schon immer mal über dieses Thema wissen wollten und sich nicht zu fragen wagten.
Edit

Content-Key: 66951

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

Printed on: April 16, 2024 at 11:04 o'clock

Member: TuXHunt3R
TuXHunt3R Aug 23, 2007 at 18:58:47 (UTC)
Goto Top
Mit VBScript kann ich dir nicht behilflich sein, ich hätte allerdings einen anderen Vorschlag:


Wenn der Code nach folgendem Muster aufgebaut ist,

<p><a href="http://www.google.ch">Google</a></p>  
<p><a href="http://www.wikipedia.ch">Wikipedia</a></p>  
<p><a href="https://administrator.de">Administrator.de</a></p>  

kannst du den entsprechenden Inhalt in eine Excel-Tabelle kopieren, aufsteigend sortieren und wieder in den Quellcode einfügen. Das sollte am schnellsten gehen, denke ich
Member: SvenGuenter
SvenGuenter Aug 23, 2007 at 19:58:47 (UTC)
Goto Top
hi gib doch bitte mal die textdatei an wie die aussieht. So wie TuxHunt3r beschrieben hat. Dann kann man mit ischerheit was machen das du dann auch VB Script lernen kannst. Es ist immer schlecht was zu programmieren oder Tipps zu geben wenn man nicht weiß wie der String aussieht den man sortieren soll.

An dem Teil könnte man schön einen bubblesort erklären.

;)
Member: Fraenky
Fraenky Aug 23, 2007 at 20:34:57 (UTC)
Goto Top
Hallo TuXHunt3R.
Danke soweit für Deinen Rat, aber zuerst wollte ich ja etwas Scipting lernen und zweitens möchte ich die Liste ja auch aufräumenm weil sie im Laufe der Zeit gewachsen ist und von daher nicht ganz einheitlich dasteht.
Hallo SvenGuenter.
Hier ist etwas beispielcode:
  <a href="../../../test/test/test/test/test/test/test/test/test/test/test/test/test/test/test/test//Regina.php">Regina</a></p>  
<p><a href="../../../test/test/test/test/test/test/test/test/test/test/test/test/test/test/test/test//Rei.php">Rei</a><br>  
  <a href="../../../test/test/test/test/test/test/test/test/test/test/test/test/test/test/test/test//Rei_Agarrube.php">Rei   
  Agarrube</a><br>
  <a href="../../../test/test/test/test/test/test/test/test/test/test/test/test/test/test/test/test//Rei_Cambinda.php">Rei   
  Cambinda</a><br>
  <a href="../../../test/test/test/test/test/test/test/test/test/test/test/test/test/test/test/test//Rei_Congo.php">Rei   
  Congo</a></p>
Und hier kann mann auch schon die Aufgabe erkennen. Zuerst möchte ich die Trennung in zwei zeilen aufheben.
Also vieleicht so: Abfrage: Wenn am Zeilenende Kein </p> oder kein <br> dann ein Space und von dort solange entf, bis der nächste Buchstabe erscheint.
Danach sollten Wir alle im Quellcode in einer Reihe stehen haben.
Weiter fällt hier auf, das am Zeilenende entweder der Schlußtab von P steht = </p> oder eben die Zeilenerzwingung durch <br>.
Das möchte ich vereinheitlichen.
Vorschlag: Abfrage: Wenn am Zeilenende </p> steht, lese die nächste Zeile.
Wenn am Zeilenende <br> steht, ersetze <br> mit </p>, gehe eine Zeile tiefer und setze am Zeilenanfang <p> ein.
Damit sollten Wir den Zeilen ein einheitliches Format geben Können.
Und danach die Sortierung.
Einverstanden mit der Logik?
Schönen Abend noch Fränky
Member: SvenGuenter
SvenGuenter Aug 24, 2007 at 06:04:12 (UTC)
Goto Top
Hallo also wenn mein HTML nicht allzu eingestaubt sein sollte muss wenn ein </p> gesetzt wurde im Vorfeld ein <p> gesetzt werden.

Sprich die Aufgabe müßte sein zu prüfen ob wenn ein </p> steht im Vorfeld ein <p> gesetzt wurde.

<br> und </br> herauslöschen da Zeilenumbrüche unerwünscht sind.

Die letzte Frage zu dem ganzen ist dann, wonach soll sortiert werden? Nach dem Linknamen oder der URL?


Gruß

Sven
Member: Fraenky
Fraenky Aug 24, 2007 at 07:41:32 (UTC)
Goto Top
Morgen SvenGuenter.
Meines Wissens nach umschließen <p></p> einen Absatz. Innerhalb dieses Absatzes kann ich Zeilenumbrüche mit <br> erzwingen, ohne einen neuen Absatz eröffnen zu müssen.
Wie im Beispielcode zu erkennen ist, bedeutet das, das in manchen Zeilenanfängen ein <p> steht, dann am Zeilenende mit <br> eine neue Zeile erzwungen wird, darum, weil ja noch der selbe Absatz, am neuen Zeilenanfang auch kein neuer Tag<p> zu finden ist. Schema:
<p> Text <br>
Text <p/>
Und darum sollte das <br> mit </p> ersetzt werden, dann ist die erste Zeile in Ordnung und in der zweiten Zeile das Eröffnungstag <p> gesetzt werden, dann ist auch diese Zeile in Ordnung.
Das Ordnungsprinzip soll sich auf den Linknamen beziehen, währe aber gut, wenn Wir das wahlweise gestallten könnten, also am Anfang mit einer Abfrage klären.
Danke soweit
Fränky
Member: SvenGuenter
SvenGuenter Aug 24, 2007 at 10:44:56 (UTC)
Goto Top
Hi Franky

Ja ist klar was du meinst.

Ich mache da mal was fertig und erläuter das dann im Quellcode.

Nur noch zur Info. Die Liste liegt als txt datei vor?


Wenn ja hast du nachher hier eine Lösung.

Gruß

Sven
Member: bastla
bastla Aug 24, 2007 at 13:06:40 (UTC)
Goto Top
Hallo Fraenky!

Ich bin ja schon auf SvenGuenter's Variante gespannt.

Bis die da ist, habe ich mir ein wenig die Zeit vertrieben und für die Sortierung etwas von MS geklaut.

An sich ist es nicht unbedingt die beste Idee, auf mehreren Hochzeiten gleichzeitig tanzen zu wollen (hier also das "Bereinigen" mit dem "Sortieren" zu kombinieren), aber da zum Sortieren nach verschiedenen Kriterien die Datensätze ohnehin zerlegt werden müssen, kommt alles in einen Waschgang:
sUnsortiert = "D:\Unsortiert.txt" 'Quelldatei  
sSortiert = "D:\Sortiert.txt"     'Zieldatei  

Const ForReading = 1, ForWriting = 2, ForAppending = 8 'Öffnungsarten für Textdateien  
Set fso = CreateObject("Scripting.FileSystemObject") 'für Dateisystemzugriffe  

'für die Definition der Datenfelder (siehe verlinkter Artikel)  
Const adVarChar = 200
Const MaxCharacters = 255
Const adFldIsNullable = 32

Set DataList = CreateObject("ADOR.Recordset") 'Datenbankobjekt erstellen  
DataList.Fields.Append "URL", adVarChar, MaxCharacters, adFldIsNullable  'Feld "URL" definieren  
DataList.Fields.Append "Text", adVarChar, MaxCharacters, adFldIsNullable 'Feld "Text" definieren  
DataList.Open

Set oUnsortiert = fso.OpenTextFile(sUnsortiert, ForReading) 'Unsortierte Datei zum Lesen öffnen  
Do While Not oUnSortiert.AtEndOfStream 'Schleife bis zum Dateiende  
	DataList.AddNew 'neuen Datensatz erstellen  
	aZeile = Split(oUnsortiert.ReadLine, """") 'Zeile einlesen und an den Anführungszeichen zerteilen  
	If UBound(aZeile) = 2 Then '2 Anführungszeichen gefunden - 3 Teile:  
		'1. Teil = aZeile(0): alles vor URL (vor dem ersten Anführungszeichen)  
		'2. Teil = aZeile(1): URL (gefunden zwischen Anführungszeichen)  
		'3. Teil = aZeile(2): alles nach URL (nach dem zweiten Anführungszeichen)  

		'Zerlegung des 3. Teiles:  
		sText = Left(aZeile(2), InStr(aZeile(2), "<") - 1) 'bis zum ersten "<"  
		sText = Mid(sText, InStrRev(sText, ">") + 1) 'ab dem letzten ">"  
		DataList("URL") = aZeile(1) 'Feld "URL" befüllen  
		DataList("Text") = sText    'Feld "Text" befüllen   
		DataList.Update '...  und Datensatz eintragen  
	Else
		'anderer Zeilenaufbau - wäre näher zu untersuchen  
	End If
Loop
oUnsortiert.Close 'Eingabedatei schließen  

'Sortierkriterium feststellen - Billigvariante ;-)  
R = MsgBox("Sortierung nach Name (Ja) oder nach URL (Nein)?", vbYesNo)  
If R = vbYes Then
	DataList.Sort = "Text"  
Else
	DataList.Sort = "URL"	  
End If

'Zieldatei öffnen; ev bereits vorhandene Datei überschreiben  
Set oSortiert = fso.OpenTextFile(sSortiert, ForWriting, True)
DataList.MoveFirst 'beim ersten Datensatz beginnen ...  
Do Until DataList.EOF '... und bis zum letzten durchgehen  
	'Ausgabezeile zusammensetzen und schreiben  
	oSortiert.WriteLine "<p><a href=""" & _  
		DataList.Fields.Item("URL") & _  
		""">" & _  
		DataList.Fields.Item("Text") & _  
		"</a></p>"  
	'nächsten Datensatz auswählen  
	DataList.MoveNext
Loop
'Ausgabedatei schließen  
oSortiert.Close
Falls Dich die Schreibweise
""">"  
irritieren sollte: Um ein Anführungszeichen zu schreiben, muss dieses verdoppelt werden - in Zusammenhang mit dem Beginn eines Textteiles entsteht dann eben die beschriebene Sequenz. Als Alternative könntest Du verwenden:
Chr(34) & ">"  

Grüße
bastla

P.S.: Ev Fehler habe ich extra für Dich (zu Übungszwecken) eingebaut ... face-devilish
Member: Fraenky
Fraenky Aug 24, 2007 at 14:11:07 (UTC)
Goto Top
Hallo SvenGuenter.
Ja, den Code kann ich natürlich in der oben aufgezeigten Syntax in einer Textdatei abspeichern.
Auch wenn der Super Bastla schon ein Skript vorgelegt hat, bin ich an Deiner Lösung, möglichst mit Erklärungen sehr interesiert. Danke erstmal.
Member: Fraenky
Fraenky Aug 24, 2007 at 14:15:07 (UTC)
Goto Top
Hallo Bastla.
Schön wieder von Dir zu hören.
Der Bericht zum externen Link über Monad ist interessant, auch wenn ich ihn nicht in allen Einzelheiten verstanden habe, überzeugt doch die verkürzte Syntax durch direktes Ansprechen der Zusatzmodule. Auch die Optionen in der Pipeline scheinen recht interesant zu sein.
Laufen die Scripte auf jedem Win-Rechner oder muß zudätzlich etwas installiert werden?
Dein Script werde ich jetzt mal ausprobieren.
Nach dem ersten Eindrock bin ich mir nicht sicher, ob Du die Problematik bezüglich der zwei Zeilen Schreibweise bei Linknamen mit zwei oder mehr Wörtern mit behandelt hast. Mal sehen.
Alles Klar, die einzelnen Teile werden unten wieder zusammengebaut.
Als erstes fällt die Fehlermeldung nach Starten des Scripts auf:
"c:\skript\Liste_sort\Liste sortieren"  
hat keine Dateierweiterung.
Meines Wissens nach gibt die Dateierweiterung den Typ des Dokuments an. In diesem Fall .vbs
So habe ich Deinen Code auch abgespeichert als Liste_sortieren.vbs.
Da weiß ich jetzt nicht, wo der Fehler, den Du für mich eingebaut hast, ist. Vieleicht kannst Du mir mal die Richtung angeben, in der ich gucken sollte.
Alles Klar. Problem hatte wieder mit den Zugriffsrechten zu tuen.
Jetzt habe ich die Fehlermeldung Zeile 27 Ungültiger Prozeduraufruf Left. Sieht doch aber ganz logisch bei der Zerlegung der Zeile aus. Mit den Bezeichnungen der Fachtermini habe ich es ja nicht so. Ahh 1. Fehler gefunden. War ja eigentlich logisch. Aber der zweite ist auch nicht schlecht mit den verschwundenen Linknamen! Tolle Überraschung nach der ersten Freude. face-sad
Was auf jeden fall auffällt sind jede menge Zeien mit
<p><a href=""></a></p>      
Die könnten auf jeden Fall gelöscht werden. Aber sortiert ist die Liste auf jeden Fall schon mal. Super face-smile
Weiterhin fällt hier die ersklassige Kommentierung auf.
Sorry für das kleine Durcheinander. Dachte, das mein Kommentar automatisch unten angefügt wird.
Gruß Fränky
Member: bastla
bastla Aug 24, 2007 at 14:20:42 (UTC)
Goto Top
Hallo Fraenky!

An sich ist der Zusammenhang mit (damals Monad, heute PowerShell - in Vista integriert, für XP als Download) nur zufällig - mir ging es um die (im unteren Teil beschriebene) Sortierung. Da SvenGuenter "Bubblesort" (oder vielleicht auch "Quicksort") versprochen hatte, wollte ich noch eine andere Variante ins Spiel bringen ...

Vielleicht noch als Anmerkung: Gerade zum Thema "Sortierung" liegt eine Menge fertiger Code im Web herum - zB (in Google prominent platziert)

http://www.shadoware.de/vb/sortarray.html
http://www.aspheute.com/artikel/20000906.htm
http://vb-tec.de/qsort.htm (eher für VB5/6 gedacht)

sodass hier "Eigenprogrammierung" kaum nötig ist.

Grüße
bastla

[Edit] Als ich mit dem Kommentar begonnen habe, hätte er noch zum vorhergehenden gepasst, jetzt ist er "nach unten (16:15:07 Uhr) zu denken" ... face-wink [/Edit]
Member: bastla
bastla Aug 24, 2007 at 23:53:58 (UTC)
Goto Top
Hallo Fraenky!

Da weiß ich jetzt nicht, wo der Fehler, den Du für mich eingebaut hast, ist. Vieleicht kannst Du mir mal die Richtung angeben, in der ich gucken sollte.
Ich formuliere es einmal anders: Solltest Du in meinem (oberflächlich getesteten) Script irgendwelche Fehler finden, dann doch wohl nicht, weil mir diese einfach passiert wären ... face-wink face-wink face-wink *Ironie-Tags setze ich aber jetzt nicht auch noch*
Allerdings läuft das Script bei mir mit Deinen (wenigen) Beispielsdaten erfolgreich und mit dem gewünschten Ergebnis durch ...

Weiterhin fällt hier die ersklassige Kommentierung auf.
Vielleicht einigen wir uns auf "umfangreich"; Da Du Deinen Lernwillen bekundet hattest, wollte ich auch etwas beitragen ...

Grüße
bastla
Member: Fraenky
Fraenky Aug 25, 2007 at 00:09:09 (UTC)
Goto Top
Hallo Bastla.
Bist Du auch noch wach.
Den Befehl zum starten von der Kommandozeile hatten Wir ja beim DynRep_1 schon und da funktionierte es auch, allerdings mit Pfadangabe. Bei diesem allerdings nicht. Mußte extra als Admin angemeldet sein. Wo muß ich denn jetzt suchen, um die Linknamen einzufügen? Vieleicht kannst Du mir ja mal ein paar Zeilennummern geben, mit denen ich mich beschäftigen muß.
Ansonsten eine gute Nacht noch
Fränky
Member: bastla
bastla Aug 25, 2007 at 00:23:12 (UTC)
Goto Top
Hallo Fraenky!

Wie schon erwähnt - es gibt keine von mir beabsichtigten Fehler, und bei mir funktioniert das (soeben wieder von hier heruntergeladene) Script mit den Beispielsdaten oben ...

Um besser nachvollziehen zu können, welche Werte sText annimmt (dort werden die Namen zunächst gespeichert), kannst Du jeweils nach den Zeilen "sText=..." eine Zeile
MsgBox sText
einbauen, um den Variableninhalt anzeigen zu lassen. Vorweg wäre auf die gleiche Art auch ein Blick auf aZeile(2) zu empfehlen - dort sollte, wie beschrieben, zB beim ersten Beispiel oben ">Regina</a></p>" enthalten sein.

Besser geht das Ganze natürlich mit einem Debugger, wobei es zur Not bei den meisten VBScripts auch der VBA-Editor zB von Excel tut. Dort kannst Du (nachdem Du vor die erste Scriptzeile ein "Sub Test" und nach die letzte Zeile das korrespondierende "End Sub" gesetzt hast), mit der Taste F8 zeilenweise das Script ausführen lassen und durch einfaches Stellen des Mauszeigers (ohne Klicken) auf eine Variable ihren derzeitigen Inhalt ansehen.

Zusätzlich kannst Du mit Strg-G den Direktbereich einblenden und dort zB "? sText" eingeben, um den Inhalt der Variablen anschreiben zu lassen. Wichtig ist dabei, dass das Programm noch nicht beendet ist (erkennbar an der gelben Markierung der aktuellen Zeile).

Eine weitere Möglichkeit (immer noch im VBA-Editor) ist, direkt in den Scriptcode an geeigneter Stelle ein
Debug.Print sText
oder, bei mehreren solcher Ausgaben, zur Unterscheidung ein
Debug.Print "Variable sText: " & sText  
zu setzen - damit wird automatisch bei Ausführung dieser Zeile in den Direktbereich geschrieben.

Grüße
bastla
Member: Fraenky
Fraenky Aug 25, 2007 at 08:26:55 (UTC)
Goto Top
Hallo SvenGuenter
Verstehe. Alles klar. Trotzdem Danke nochmal für Deine Reaktion. Du hast Dich vieleicht etwas zu schnell von Bastla ins Bockshorn jagen lassen. In diesem Sinne wünsche ich Dir freundlich etwas mehr Selbstbewustsein. Du hättest bestimmt auch eine Lösung zeigen können. Ich würde das ein wenig mehr sportlich sehen. Das ist wie beim Schach. Spielt man nur mit schwächeren Partnern, gewinnt man zwar, bringt einen das aber auch nicht viel weiter. Wirklich weiter bringt einen das Spiel mit stärkeren. Und nur die wenigsten menschlichen Wesen sind auf allen Gebieten hoch entwickelt, so das man noch notfalls woanders Punkten kann, bis man das Schach spielen weiter entwickelt hat.
Also, in diesem Sinne
Fränky
P.S. Oder arbeitest Du noch an dem Script? Obwohl ja das von Dir angedeutete Zeitfenster "nachher" lautete, was auf keinen Fall morgen bedeutet.
In diesen Fall könnten Wir diesen Beitrag als kleinen Exkurs über eine gesunde Lernhaltung betrachten. face-wink
Member: Fraenky
Fraenky Aug 25, 2007 at 09:35:43 (UTC)
Goto Top
Hallo Bastla

Wie schon erwähnt - es gibt keine von
mir beabsichtigten Fehler, und bei mir
funktioniert das (soeben wieder von hier
heruntergeladene) Script mit den
Beispielsdaten oben ...

face-confused Also ich muste erst in Zeile 27 + 28 die < > Zeichen vertauschen, um das Programm ins Laufen zu kriegen. Die Zeilen sehen jetzt so aus:
	sText = Left(aZeile(2), InStr(aZeile(2), ">") - 1) 'bis zum ersten "<"  
		MsgBox sText
		sText = Mid(sText, InStrRev(sText, "<") + 1) 'ab dem letzten ">"  
		MsgBox sText

Und das mit dem MsgBox sText funktioniert nicht. Es öffnen sich nur jede Menge Fenster, in dem ich auf OK klicken darf. =face-smile bei über 2000 Einträgen. ( Alt GR - Strg - Entf ) Und die Fenster kamen weiter, so das ich mich in Win abmelden mußte. Da fällt mir noch ein, das die Zeilen am ende zu addieren sind und das Zeilen ohne url und Linknamen zu löschen sind.
Desweiteren brauche ich eine Abfrage, in dem ein Ordner ausgewählt werden kann. Die Dateien dieses Ordners sollen dann mit der Linkliste Linknamen verglichen werden.
Wenn mehr Linknamen als Dateien im Ordner vorhanden sind, soll im Ordner die Datei Linkname.php erstellt werden, wobei eine Übersetzung der Sonderzeichen statfinden muß.
Beispiel:
Name im Browser: Coração
Name im Quelltext: Cora&ccedil;&atilde;o
Name des Ordners: Cora%E7%E3o.php
Im ganzen:<p><a href="../../../Pfad/Cora%E7%E3o.php">Cora&ccedil;&atilde;o</a></p>  

Wenn mehr Dateien im Ordner als Links vorhanden sind, Erstelle Link an alphabetischer Position.
Vorher müssen noch dopellte Linkeinträge gelöscht werden. Groß- und kleinschreibung beachten. Weiterhin kommt es vor, das Linkname großgeschriben und derselbe Linkname kleingeschriben auf den selben Ordner verweisen, In diesem Fall ist der Großgeschriebene über dem kleingeschriebenen zu stellen.

Um besser nachvollziehen zu können,
welche Werte sText annimmt
(dort werden die Namen zunächst
gespeichert), kannst Du jeweils nach den
Zeilen "sText=..." eine Zeile
MsgBox sText
> 
einbauen, um den
Variableninhalt anzeigen zu lassen. Vorweg
wäre auf die gleiche Art auch ein Blick
auf aZeile(2) zu empfehlen
- dort sollte, wie beschrieben, zB beim
ersten Beispiel oben
">Regina</a></p>"
enthalten sein.

Die ganze Sache mit dem Debuggen geht mir etwas zu weit. face-confused
Ich bin erstmal an Syntax und Programmlogik interesiert. Wir können Uns ja dann gegebenenfalls später mit der Fehlersuche beschäftigen, wenn ich etwas von Codeaufbau verstanden habe.
Weißt Du, eigentlich bin ich ja ein Logiker. Ich schwebe etwas über den Dingen, habe eine gute Perspektieve, mache mir Gedanken über dies und das und das alles in meiner Sprache. Sobald ich etwas in einer Fremdsprache ausfrücken muß, hat das, wie durch ein Nadelör, große Auswirkungen auf den Output. Wir sollten daher mit ganz kleinen Schritten vorangehen.
Lernen macht spaß mit Erfolgserlebnissen. Erfolgserlabnisse hat man, wenn die Lektionen dem Vermögen des Rezipienten angepasst sind.
In diesem Sinne grüßt
Fränky
Member: bastla
bastla Aug 25, 2007, updated at Oct 18, 2012 at 16:32:22 (UTC)
Goto Top
Hallo Fraenky!

Und das mit dem MsgBox sText funktioniert nicht. Es öffnen sich nur jede Menge Fenster, in dem ich auf OK klicken darf.
Du darfst vor dem Klicken auch die Ausgabe lesen - oder eben festellen, dass keine Ausgabe enthalten ist, woraus folgt, dass die ausgegebene Variable keinen Inhalt hat. Dazu nochmals der Hinweis: Sieh Dir zunächst an, was in "aZeile(2)" steht - "sText" soll ja daraus extrahiert werden.

Um beim zitierten Beispiel aus Deiner ersten Zeile
<a href="../../../test/test/test/test/test/test/test/test/test/test/test/test/test/test/test/test//Regina.php">Regina</a></p>  
zu bleiben: In aZeile(2) steht nach dem Einlesen
>Regina</a></p>
Das Zerlegen sollte nun so erfolgen, dass ich das erste auf den Linktext folgende Zeichen (das "<" aus dem schließenden "</a>"-Tag) suche und den Teil davor (Left) übernehme - daher:
sText = Left(aZeile(2), InStr(aZeile(2), "<") - 1) 'bis zum ersten "<"  
Es wird also in sText zunächst einmal gespeichert:
>Regina
Mit der nächsten Zeile
sText = Mid(sText, InStrRev(sText, ">") + 1) 'ab dem letzten ">"  
nehme ich alles nach dem letzten (von rechts her gesehen ersten) ">" (dieses stammt vom Schließen der URL und sollte eigentlich ohnehin das einzige in Frage kommende Zeichen sein - dennoch zur Sicherheit Suche von rechts mit "InStrRev()") - "Mid()" liefert ohne Angabe einer Länge alle Zeichen von der angegebenen Startposition bis zum Ende des Textes, daher bleibt:
Regina
Ein Umdrehen der Zeichen "<" und ">" hätte also eigentlich nicht erforderlich sein sollen ...
= bei über 2000 Einträgen. ( Alt GR - Strg - Entf )
Hatte ich gelegentlich das Stichwort "Testdaten" erwähnt? face-wink Stelle 5 bis 10 Zeilen, die möglichst viele Fälle abdecken, in eine Testdatei und arbeite damit ...
Zum Abbrechen eines laufenden Scripts kannst Du zunächst die Tastenkombination Strg-Untbr versuchen bzw über Strg-Alt-Entf den Task-Manager aufrufen und dort im Register "Prozesse" die "wscript.exe" markieren und "Prozess beenden" wählen - ein Abmelden oder gar Windows-Neustart sollte kaum nötig sein.
Im Übrigen bist Du nach eigenem Bekunden an ganz kleinen Schritten interessiert - bevor Du also am Abgleichen von Links mit Ordnern oder Ähnlichem zu arbeiten beginnst (ich werde das nämlich vorläufig nicht tun), versuche einmal das vorliegende Script zu verstehen und gegebenen Falles anzupassen.

Vielleicht wäre auch noch ein Hinweis auf die Suchfunktion dieses Forums angebracht, wo Du zB zum Thema "Abfrage, in dem ein Ordner ausgewählt werden kann" (in etwas anderer Formulierung, wie etwa "Ordnerauswahl VBS") eigentlich fündig werden solltest. Außerdem bliebe Dir auch noch ein "biooptischer Scan" (© Biber) der Themen in "Entwicklung > Programmiersprachen > Visual Basic, VBA und .Net" ...

... und nicht zuletzt ein Blick in den Quellcode eines von mir kürzlich abgeschlossenen Projektes face-wink.

Grüße
bastla
Member: Fraenky
Fraenky Aug 25, 2007 at 12:40:02 (UTC)
Goto Top
Hallo Bastla.

Ein Umdrehen der Zeichen "<"
und ">" hätte also
eigentlich nicht erforderlich sein sollen

Aber nur so ließ sich das Script starten. Und langsam verstehe ich auch, warum ich zwar eine sortierte Liste habe, aber keine Linknamen. Durch das umdrehen der Zeichen werden diese nicht mehr erfasst.
Jetzt habe ich wieder den Originalcode genommen und promt kriege ich folgende Fehlermeldung:
Zeile 27
Zeichen 3
Ungültiger Prozeduraufruf oder ungültiges Argument: "Left"
Code 800A0005
Quelle: Laufzeitfehler in MS VBScript

Und da Du ja angedeutet hattest, das Du Fehler einbauen wolltest, habe ich natürlich probiert. Und mit dem umdrehen hatte ich immerhin teilweisen Erfolg.

Hatte ich gelegentlich das Stichwort
"Testdaten" erwähnt? face-wink
Stelle 5 bis 10 Zeilen, die möglichst
viele Fälle abdecken, in eine Testdatei
und arbeite damit ...

Ok. Bis jetzt haben Deine Scripte alle wunderbar funktioniert. Und wenn ich alle nehme, bin ich auch sicher, alle Fälle zu haben. Werde das in Zukunft wohl modifizieren müssen.

Im Übrigen bist Du nach eigenem
Bekunden an ganz kleinen Schritten
interessiert - bevor Du also am Abgleichen
von Links mit Ordnern oder Ähnlichem zu
arbeiten beginnst (ich werde das nämlich
vorläufig nicht tun), versuche einmal
das vorliegende Script zu verstehen und
gegebenen Falles anzupassen.

Also kaltes Wasser. Mit welcher relativ einfach zu erlernenden Programmiersprache sollte ich den anfangen, die sowohl auf Windows wie auf Webservern einsetzbar ist und kennst Du ein Tutorial, das bei Null anfängt, also bei Definitionen aller Programmteile wie Funktionen, Felddeklarationen Schleifen usw?

Den Code werde ich mir jetzt nochmal anschauen.

Danke soweit
Fränky
Member: bastla
bastla Aug 25, 2007 at 13:16:09 (UTC)
Goto Top
Hallo Fraenky!

Zeile 27
Zeichen 3
Ungültiger Prozeduraufruf oder ungültiges Argument: "Left"
Die Fehlermeldung deutet darauf hin, dass in aZeile(2) kein "<" existiert oder dieses bereits an erster Stelle steht (wodurch das auf die Suche nach der Position mit InStr() folgende -1 natürlich ein nicht verwertbares Ergebnis von -1 oder 0 liefert).

Auch das lässt sich natürlich mit einer MsgBox darstellen:
MsgBox InStr(aZeile(2), "<")  
Besser ist es aber, "aZeile(2)" zu betrachten und daraus abzuleiten, warum das "Left()" fehlschägt.

In "aZeile(1)" steht übrigens die URL - so kannst Du die entsprechende fehlerhafte Zeile der Textdatei identifizieren und in weiterer Folge einen Algorithmus entwickeln, um zum Einen den Fehler abzufangen und, wichtiger, auf die offensichtlich unrichtigen Eingabedaten zu reagieren - etwa mit einem aus der URL abgeleiteten Link-Text und der Ausgabe einer Fehlermeldung in eine Logdatei. Codebeispiel:
If InStr(aZeile(2), "<") > 1 Then  
    'weiter bearbeiten nach Standard-Algorithmus  
Else
    'Inhalt genauer untersuchen - Kriterien?  
    'oder Linktext konstruieren  
    'und / oder Logeintrag für Datensatz erstellen;  
        'zum Rekonstruieren der gesamten Zeile zB  
            'sGanzeZeile = Join(aZeile, """")  
        'verwenden.  
End If

Ähnliche Überlegungen musst Du natürlich auch für die bisher von der Bearbeitung ausgeklammerten Zeilen mit mehr oder weniger als 2 enthaltenen Anführungszeichen anstellen ...

Mit welcher relativ einfach zu erlernenden Programmiersprache sollte ich den anfangen ...
VBS ist sicher keine schlechte Wahl ...

... kennst Du ein Tutorial, das bei Null anfängt ...
Leider nein - meine Einsteigerzeiten liegen schon etwas zurück (1978), und daher bin ich eigentlich nur öfters auf der Suche nach Details oder Musterlösungen zu einem Teilproblem - aber vielleicht findet sich in der VB.NET Einsteiger Tutorial etwas auch für Dich Passendes - und falls doch nicht, werden sich sicher viele zukünftige Besucher des Forums freuen, wenn Du andere empfehlenswerte Seiten findest und hier als Links einträgst ... face-smile

Grüße
bastla
Member: Fraenky
Fraenky Aug 25, 2007 at 14:33:44 (UTC)
Goto Top
Hallo Bastla.
Ja,ja, wenn man weiß, das - 1 bedeutet, das die erste Pos. nicht berücksichtigt wird und gleichzeitig nach dem dadurch ausgeklammerten Zeichen sucht, ist alles kein Problem. Also lassen Wir doch einfach die - 1 weg und schon läufts.
Außerdem war Deine Hilfestellung nicht ganz korrekt. Du hast gesagt, das Die Fehlermeldung darauf hideutet, das das > nicht da ist. Richtiger währe der Satz mit der Erweiterung gewesen: oder nicht berücksichtigt wird.
Ansonsten war die Hilfestellung als Übersetzung von Maschienensprache in Deutsch ganz gut, weil ich mich dann wieder mit der Logik auseinandersetzen konnte und dabei auch die Maschienensprache studiert habe.
Wenn Du jetzt daran noch weiter arbeiten möchtest, habe ich noch einige Sachen zu machen.
Zuerst stehen am Anfang viele <p><a href=""></a></p>. Die können entfernt werden.
Weiter gibt es Zeilen, die so aussehen:
<p><a href="Pfad/acredito.php">acredito</a></p>  
<p><a href="Pfad/acreditou.php">acreditou</a><br>  
  <a href="Pfad/Adam.php">Adam</a><br>  
  <a href="Pfad/Ad%E3o.php">Ad&atilde;o</a><br>  
  <a href="Pfad/Adonai.php">Adonai</a></p>  
<p><a href="Pfad/adoro.php">Adoro</a></p>  
Hier sind also die <br> durch </p> zu ersetzen und am Anfang <p> einzusetzen.
Stellenweise tauchen auch <p><br> auf.
Die Anzahl der Links machen sich am Ende der Links auch ganz gut.
Ansonsten sieht alles super aus.
Was so eine - 1 doch alles anrichten kann face-smile
Gruß Fränky
Member: bastla
bastla Aug 25, 2007 at 15:47:02 (UTC)
Goto Top
Hallo Fraenky!

Außerdem war Deine Hilfestellung nicht ganz korrekt. Du hast gesagt, das Die Fehlermeldung darauf hideutet, das das > nicht da ist. Richtiger währe der Satz mit der Erweiterung gewesen: oder nicht berücksichtigt wird.
So gut wie keiner ist frei von Fehlern - hier bin ich mir allerdings keines Fehlers bewusst, da meine Aussage war: "Die Fehlermeldung deutet darauf hin, dass in aZeile(2) kein "<" existiert oder dieses bereits an erster Stelle steht ...". Könntest Du bitte die Linkzeile darstellen, welche die Unkorrektheit in dieser Aussage beweist (insbesondere, da Du in Deiner Begründung abermals "<" und ">" vertauscht hast)?

Ja,ja, wenn man weiß, das - 1 bedeutet, das die erste Pos. nicht berücksichtigt wird und gleichzeitig nach dem dadurch ausgeklammerten Zeichen sucht, ist alles kein Problem. Also lassen Wir doch einfach die - 1 weg und schon läufts.
Korrektur: - 1 bedeutet, nimm das Zeichen an der Fundstelle selbst nicht mit in das Ergebnis auf, also wenn "<" an der 8. Stelle steht (siehe nochmals Beispiel oben), möchte ich nur die 7 Stellen davor behalten. Steht hingegen "<" an erster Stelle, gibt es davor keinen Linktext, der zu behalten wäre.

Grüße
bastla
Member: bastla
bastla Aug 25, 2007 at 16:13:08 (UTC)
Goto Top
... Nachtrag: Wenn ich
<p><a href="Pfad/acredito.php">acredito</a></p>  
<p><a href="Pfad/acreditou.php">acreditou</a><br>  
<a href="Pfad/Adam.php">Adam</a><br>  
<a href="Pfad/Ad%E3o.php">Ad&atilde;o</a><br>  
<a href="Pfad/Adonai.php">Adonai</a></p>  
<p><a href="Pfad/adoro.php">Adoro</a></p>  
als "Unsortiert.txt" speichere und das weiterhin unveränderte Script von oben starte und die Abfrage nach dem Sortierkriterium mit der Schaltfläche "ja" beantworte, erhalte ich als "Sortiert.txt":
<p><a href="Pfad/acredito.php">acredito</a></p>  
<p><a href="Pfad/acreditou.php">acreditou</a></p>  
<p><a href="Pfad/Ad%E3o.php">Ad&atilde;o</a></p>  
<p><a href="Pfad/Adam.php">Adam</a></p>  
<p><a href="Pfad/Adonai.php">Adonai</a></p>  
<p><a href="Pfad/adoro.php">Adoro</a></p>  
Entspricht die Formatierung des Ergebnisses nicht Deinen Wünschen (die Sortierung von HTML-Ersetzungen wie "&atilde;" war weder versprochen noch versucht)?

Grüße
bastla
Member: Fraenky
Fraenky Aug 25, 2007 at 17:07:39 (UTC)
Goto Top
Hallo Bastla.
Ich wollte hier keinesfalls den Eindruck von Korintenkakerei erwecken. Ich möchte hier nur darauf hinweisen, das ich als Anfänger in VBS auf jeden Hinweis von Dir angewiesen bin, wenn es um die Fehlersuche geht. Und das Du mir mit dem erweiterten Hinweis, wenn er überhaupt stimmt, eine erweiterte Informationsbasis hättest geben können. Das war die Intention meiner Aussage.

So gut wie keiner ist frei von Fehlern - hier bin ich mir allerdings keines Fehlers >bewusst, da meine Aussage war: "Die Fehlermeldung deutet darauf hin, dass in >aZeile(2) kein "<" existiert oder dieses bereits an erster Stelle steht ...". >Könntest Du bitte die Linkzeile darstellen, welche die Unkorrektheit in dieser >Aussage beweist (insbesondere, da Du in Deiner Begründung abermals "<" und >">" vertauscht hast)?

OK. Ich habe aus dem Gedächtnis zu zitieren versucht. Diese Aussage gibt also meinen Eindruck Deiner Aussage wieder, die auf für mich fremden Gebiet erfolgte, so das Du mir mein nicht ganz richtiges Zitat nachsehen mögest.

Korrektur: - 1 bedeutet, nimm das Zeichen an der Fundstelle selbst nicht mit in >das Ergebnis auf,...

Aber das bedeutet doch, das das Zeichen an der Fundstelle, die Fundstelle ist doch das >, und von dort sollte doch nach links(Left) eingelesen werden.
Wenn das nicht dem von mir interpretierten Schverhalt entspricht, weiß ich nicht, warum -1 eine Fehlermeldung produziert, wenn es nur die Weitergabe in sText der nächsten Zeile betreffen würde.

als "Unsortiert.txt" speichere und das weiterhin unveränderte Script von oben >starte und die Abfrage nach dem Sortierkriterium mit der Schaltfläche "ja" >beantworte, erhalte ich als "Sortiert.txt":

Ich kann Dir nur sagen, das nach einladen in den html editor und der nachfolgenden Durchsicht diese Zeilen als Unregelmäßigkeiten auffielen.

Entspricht die Formatierung des Ergebnisses nicht Deinen Wünschen (die >>Sortierung von HTML-Ersetzungen wie "&atilde;" war weder versprochen noch >versucht)?

Meinst du mit Formatierung das Zusammenbauen der einzelnen Satzteile?
Das hat alles wunderbar funkrioniert.
Auch hat das Script alles, nach einer ersten Durchsicht, richtig sortiert.
Trotzdem gibt es die oben angesprochenen Ausnahmesätze, deren Nichtbehandlung in meiner mangelhaften Auswahl der Beispieldaten liegt.
Ich sehe die Wichtigkeit ein und werde mich diesbezüglich bessern.

Alles Gute
Fränky
Member: bastla
bastla Aug 25, 2007 at 18:05:17 (UTC)
Goto Top
Hallo Fraenky!

Aber das bedeutet doch, das das Zeichen an der Fundstelle, die Fundstelle ist doch das >, und von dort sollte doch nach links(Left) eingelesen werden.
Wenn das nicht dem von mir interpretierten Schverhalt entspricht, weiß ich nicht, warum -1 eine Fehlermeldung produziert, wenn es nur die Weitergabe in sText der nächsten Zeile betreffen würde.
Die Fundstelle ist das "<" (Kleiner-Zeichen!).
Die Funktion "Left()" liest nicht "nach links", sondern "von links", also vom Wortanfang her eine bestimmte Anzahl von Zeichen.

- 1 ist dann die Ursache einer Fehlermeldung, wenn das "<" (Kleiner-Zeichen!)
  • an der ersten Stelle steht (was eigentlich bei keiner der bisher von Dir dargestellten gültigen Link-Zeilen und noch nicht einmal bei den überflüssigen Zeilen der Art
<p><a href=""></a></p>  
- auch wenn eine solche Zeile in der "Unsortiert.txt" enthalten ist, läuft das Script durch und sortiert die Zeile an den Anfang - der Fall war) oder
  • nicht enthalten ist,
da dann von links beginnend 0 (wenn an erster Stelle gefunden) oder sogar -1 (wenn nicht gefunden) Stellen gelesen werden müssten ...

Ich möchte meine Bitte von vorhin wiederholen: Poste die Zeile, die den beschriebenen Fehler verursacht!
Um Dir vor oder nach der Sortierung das Löschen der leeren Links mit einem Editor zu ersparen (auch wenn diese in einem Block an den Anfang der Datei sortiert würden), kannst Du im Script die Zeilen 19 bis 31 (zwischen "Do While Not oUnSortiert.AtEndOfStream 'Schleife bis zum Dateiende" und "Else")
	DataList.AddNew 'neuen Datensatz erstellen  
	aZeile = Split(oUnsortiert.ReadLine, """") 'Zeile einlesen und an den Anführungszeichen zerteilen  
	If UBound(aZeile) = 2 Then '2 Anführungszeichen gefunden - 3 Teile:  
		'1. Teil = aZeile(0): alles vor URL (vor dem ersten Anführungszeichen)  
		'2. Teil = aZeile(1): URL (gefunden zwischen Anführungszeichen)  
		'3. Teil = aZeile(2): alles nach URL (nach dem zweiten Anführungszeichen)  

		'Zerlegung des 3. Teiles:  
		sText = Left(aZeile(2), InStr(aZeile(2), "<") - 1) 'bis zum ersten "<"  
		sText = Mid(sText, InStrRev(sText, ">") + 1) 'ab dem letzten ">"  
		DataList("URL") = aZeile(1) 'Feld "URL" befüllen  
		DataList("Text") = sText    'Feld "Text" befüllen   
		DataList.Update '...  und Datensatz eintragen  
durch folgende Zeilen ersetzen:
 	aZeile = Split(oUnsortiert.ReadLine, """") 'Zeile einlesen und an den Anführungszeichen zerteilen  
	If UBound(aZeile) = 2 Then '2 Anführungszeichen gefunden - 3 Teile:  
		'1. Teil = aZeile(0): alles vor URL (vor dem ersten Anführungszeichen)  
		'2. Teil = aZeile(1): URL (gefunden zwischen Anführungszeichen)  
		'3. Teil = aZeile(2): alles nach URL (nach dem zweiten Anführungszeichen)  

		'Zerlegung des 3. Teiles:  
		sText = Left(aZeile(2), InStr(aZeile(2), "<") - 1) 'bis zum ersten "<"  
		sText = Mid(sText, InStrRev(sText, ">") + 1) 'ab dem letzten ">"  
		If aZeile(1) <> "" Or sText <> "" Then 'zumindest ein Eintrag  
			DataList.AddNew 'neuen Datensatz erstellen  
			DataList("URL") = aZeile(1) 'Feld "URL" befüllen  
			DataList("Text") = sText    'Feld "Text" befüllen   
			DataList.Update '...  und Datensatz eintragen  
		End If
Dadurch wird verhindert, dass Links, die weder eine URL noch einen Link-Text enthalten, in die Datenbank aufgenommen werden. Wenn Du dann noch in der Zeile
		If aZeile(1) <> "" Or sText <> "" Then 'zumindest ein Eintrag  
das "Or" in ein "And" ändertest, also auf
		If aZeile(1) <> "" And sText <> "" Then 'beide Einträge erforderlich  
könntest Du die Ergebnisdaten auf vollständige Links beschränken.

Grüße
bastla
Member: Fraenky
Fraenky Aug 25, 2007 at 19:43:42 (UTC)
Goto Top
Hallo Bastla.
Mann könnte auch sagen, füge Zeile
If aZeile(1) <> "" Or sText <> "" Then   
'zumindest ein Eintrag ein.

gruß
Fränky
Member: bastla
bastla Aug 25, 2007 at 19:53:30 (UTC)
Goto Top
Hallo Fraenky!

Nicht ganz, da (abgesehen vom "End If" face-wink) auch die Zeile
			DataList.AddNew 'neuen Datensatz erstellen  
nach unten wandern musste - daher gleich die Angabe des gesamten Blockes ...

Grüße
bastla
Member: Fraenky
Fraenky Aug 25, 2007 at 20:11:33 (UTC)
Goto Top
Hallo Bastler.
Na klar. Füge über Zeile

DataList("URL") = aZeile(1)   
'Feld "URL" befüllen
Die Zeile
If aZeile(1) <> "" Or sText <> "" Then  

'zumindest ein Eintrag ein.

Die Zeile bedeutet doch: Wenn aZeile(1), also die URL, <> "" , also leere Umschließungen enthält, UND /ODER sText, also Linkname, auch, Then Löschen
Gruß
Fränky
Member: bastla
bastla Aug 25, 2007 at 20:30:10 (UTC)
Goto Top
Hallo Fraenky!

Die Zeile bedeutet doch:
Wenn aZeile(1), also die URL, <> "" , also leere Umschließungen enthält, UND /ODER sText, also Linkname, auch, Then Löschen
"<>" steht für "ungleich" oder "nicht"
"" symbolisiert einen nicht vorhandenen Text (zwischen den beiden Anführungszeichen steht nichts), auch Leerstring genannt

daher: Wenn die URL ungleich Leerstring (anders formuliert: "nicht leer" ist - also zumindest ein Zeichen enthält) ODER (analog) der Link-Text einen Inhalt aufweist, dann Datensatz in Datenbank (DataList) aufnehmen - wenn keines der beiden Elemente wenigstens ein Zeichen enthält, Datensatz nicht verwenden.

Wenn statt des ODER ein UND verwendet wird, dürfen beide Elemente nicht leer sein, damit der Datensatz behalten wird (das war Dir als Logiker aber natürlich klar face-wink).

Grüße
bastla
Member: Fraenky
Fraenky Aug 25, 2007 at 20:59:43 (UTC)
Goto Top
Hallo Bastla.
Muß jetzt hinter dem Then noch eine Anweisung stehen oder nicht?
Die vier Datalist einträge standen doch auch schon vor der IF Then Schleife
da.
Der Code sieht wie folgt aus:
sText = Left(aZeile(2), InStr(aZeile(2), "<") ) 'bis zum ersten "<"  
		sText = Mid(sText, InStrRev(sText, ">") + 1) 'ab dem letzten ">"  
If aZeile(1) <> "" Or sText <> "" Then 'zumindest ein Eintrag  
			DataList.AddNew 'neuen Datensatz erstellen  
			DataList("URL") = aZeile(1) 'Feld "URL" befüllen  
			DataList("Text") = sText    'Feld "Text" befüllen   
			DataList.Update '...  und Datensatz eintragen  
		End If
	Else
		'anderer Zeilenaufbau - wäre näher zu untersuchen  
	End If
Loop
Und meine Fehlermeldung deutet darauf hin, das noch was fehlt.
Zeile 55
Zeichen 28
Nicht abgeschlossene Zeichenfolgenkonstante
Code 800A0409
Quelle: Kompilierungsfehler in MS VBScript
Alles Gute
Fränky
Member: bastla
bastla Aug 25, 2007 at 21:20:32 (UTC)
Goto Top
Hallo Fraenky!

Muß jetzt hinter dem Then noch eine Anweisung stehen oder nicht?
Nein; damit wird der "DataList"-Block eingeleitet und mit dem darunter stehenden "End If" abgeschlossen - insofern sieht der Code OK aus; allerdings wird der Fehler ja erst für Zeile 55 angezeigt.

Es wäre daher sinnvoll, das gesamte Script zu posten (und bitte verwende dafür < code> und < /code> - natürlich ohne die Leerzeichen); dann sind auch die Einrückungen der Codeblöcke besser zu erkennen.

Grüße
bastla
Member: Fraenky
Fraenky Aug 25, 2007 at 21:41:54 (UTC)
Goto Top
Hallo Bastla.
Ist ja auch logisch.
Um nach mal auf den Logiker sprechen zu kommen.
Ich bin natürlich viel mehr, als ein Logiker, wie jeder andere Mensch auch viel mehr als eine Eigenschaft ist. In der Logik halte ich mich nur für einigermaßen entwickelt. Wollte das vorhin schon klarstellen, aber dann kam meine Abendmeditation, fester Termin, und dann die anderen Postings und so.
Hier der Code:

sUnsortiert = "C:\skript\Liste_sort\liste.txt" 'Quelldatei  
sSortiert = "C:\skript\Liste_sort\Sortiert.txt"     'Zieldatei  

Const ForReading = 1, ForWriting = 2, ForAppending = 8 'Öffnungsarten für Textdateien  
Set fso = CreateObject("Scripting.FileSystemObject") 'für Dateisystemzugriffe  

'für die Definition der Datenfelder (siehe verlinkter Artikel)  
Const adVarChar = 200
Const MaxCharacters = 255
Const adFldIsNullable = 32

Set DataList = CreateObject("ADOR.Recordset") 'Datenbankobjekt erstellen  
DataList.Fields.Append "URL", adVarChar, MaxCharacters, adFldIsNullable  'Feld "URL" definieren  
DataList.Fields.Append "Text", adVarChar, MaxCharacters, adFldIsNullable 'Feld "Text" definieren  
DataList.Open

Set oUnsortiert = fso.OpenTextFile(sUnsortiert, ForReading) 'Unsortierte Datei zum Lesen öffnen  
Do While Not oUnSortiert.AtEndOfStream 'Schleife bis zum Dateiende  
	DataList.AddNew 'neuen Datensatz erstellen  
	aZeile = Split(oUnsortiert.ReadLine, """") 'Zeile einlesen und an den Anführungszeichen zerteilen  
	If UBound(aZeile) = 2 Then '2 Anführungszeichen gefunden - 3 Teile:  
		'1. Teil = aZeile(0): alles vor URL (vor dem ersten Anführungszeichen)  
		'2. Teil = aZeile(1): URL (gefunden zwischen Anführungszeichen)  
		'3. Teil = aZeile(2): alles nach URL (nach dem zweiten Anführungszeichen)  
                               'Convite.php">Convite<p></p>  
		'Zerlegung des 3. Teiles:  
		sText = Left(aZeile(2), InStr(aZeile(2), "<") ) 'bis zum ersten "<"  
		sText = Mid(sText, InStrRev(sText, ">") + 1) 'ab dem letzten ">"  
If aZeile(1) <> "" Or sText <> "" Then 'zumindest ein Eintrag  
			DataList.AddNew 'neuen Datensatz erstellen  
			DataList("URL") = aZeile(1) 'Feld "URL" befüllen  
			DataList("Text") = sText    'Feld "Text" befüllen   
			DataList.Update '...  und Datensatz eintragen  
		End If
	Else
		'anderer Zeilenaufbau - wäre näher zu untersuchen  
	End If
Loop
oUnsortiert.Close 'Eingabedatei schließen  

'Sortierkriterium feststellen - Billigvariante ;-)  
R = MsgBox("Sortierung nach Name (Ja) oder nach URL (Nein)?", vbYesNo)  
If R = vbYes Then
	DataList.Sort = "Text"  
Else
	DataList.Sort = "URL"	  
End If

'Zieldatei öffnen; ev bereits vorhandene Datei überschreiben  
Set oSortiert = fso.OpenTextFile(sSortiert, ForWriting, True)
DataList.MoveFirst 'beim ersten Datensatz beginnen ...  
Do Until DataList.EOF '... und bis zum letzten durchgehen  
	'Ausgabezeile zusammensetzen und schreiben  
	oSortiert.WriteLine "<p><a href=""" & _  
		DataList.Fields.Item("URL  
		""">" & _  
		DataList.Fields.Item("Text") & _  
		"</a></p>"  
	'nächsten Datensatz auswählen  
	DataList.MoveNext
Loop
'Ausgabedatei schließen  
oSortiert.Close
Bis dann
Fränky
Member: bastla
bastla Aug 25, 2007 at 21:51:15 (UTC)
Goto Top
Hallo Fraenky!

In der Zeile 55 waren einige Zeichen am Ende abhanden gekommen - sie sollte so aussehen:
		DataList.Fields.Item("URL") & _  

Ich bin natürlich viel mehr, als ein Logiker ...
... was kein vernünftiger Mensch in Zweifel ziehen würde - aber eben auch Logiker, und auf diese von Dir selbst genannte Eigenschaft hatte ich mich (positiv gemeint) bezogen ...

Grüße
bastla

P.S.: Das war's für heute von mir ...
Member: Fraenky
Fraenky Aug 25, 2007 at 22:28:33 (UTC)
Goto Top
Hallo Bastla.
Hast recht, jetzt habe ich es auch gesehen. Im ursprünglichen Code war alles vorhanden.
Zum Logiker: In der Reflektion meiner Aussage fiel mir die unzulässige Einschränkung auf. Und da ich gerne Sachen im Fluß der Dinge einfüge, habe ich hier nur die Gelegenheit ergriffen, die Aussage klarzustellen. Nur deshalb.
Hätte nicht gedacht, das beim kopieren Code verloren geht.
Weiter fällt auf, das mir zu viele
<p><a href=""></a></p>   
am Anfang stehen. Wo sollen die den alle herkommen?
Desweiteren diese Lösungsherrausvorderung:
Rei_Jagube.php"></a></p>  
Heist, alle Doppelnamen wie Rei_Jagube.php">ReiJagube</a><br> werden ausgelassen
Und weiter werden die Namen mit < ,also Redor< /Redor.php">Redor<</a></p>
dargestellt.
Warum muß den
DataList("URL") = aZeile(1)  
aZeile(1) an URL übergeben werden, soll heißen, warum wird nicht mit aZeile weitergearbeitet?
Also, langsam kann ich schon ein wenig erkennen, vor allem wegen deiner Kommentierungen.
Also noch mal zum allgemeinen Verständnis.
Die .vbs haben eine breitere Einsatzmöglichkeit bzl der Logik, laufen dagegen nicht in jeder Arbeitsumgebung,wohingegen die .bat fundamentaler Organisiert sind und von daher breiter einsetzbar sind, zB bzl Arbeitsumgebung und handling von Codierungen, aber Einschränkungen im logischen Bereich haben.
Jetzt wirst Du als Programmierer natürlich, weil Du nicht alle eventuellen Arbeitsumgebungen kennst, in denen Dein Programm laufen könnte, von der .bat ausgehen, von dort ein Script aufrufen und wenn das nicht funktioniert, mit einer Alternative in .bat weiterfahren,
Ich hingegen, der ich meine Arbeitsumgebung kenne, so weit ich sie verstanden habe, kann doch von .vbs ausgehen, und von dort, zB für Codierungsaufgaben, die .bat aufrufen.
Für den Aufruf würde ich .vbs immer anweisen, zu erst in dem Ordner nach der .bat zu suchen, in dem das Script selbst liegt.
Dazu mache ich mir folgende Ordnerstruktur zu eigen.
Aussagekräftiger Ordnername=Arbeitsordner
In diesem Ordner liegen .vbs und alle aufgerufenen .bat und Startparameter.txt und alle sonstigen benötigten Dateien, zB liste.txt
Dann wird ein Ordner Ergebnisse angelegt, in dem diese abgespeichert werden,
Da haben Wir eine gute Ordnung.
Was ich noch für sehr nützlich halte:
Wenn ich den Mauszeiger auf einer Datei halte, bekomme ich doch eine Info über Typ, Geändert und Größe angezeigt. Wenn dort noch Infos über das .vbs auftauchen würden, könnte das sehr Hilfreich sein.
ZB: Achtung, alle .rtf´s im Arbeitsordner sind bei Ausführung betroffen!!!
Ist soetwas zu realiesieren?
Etwas zu Postings:
Ich befinde mich doch in Übereinstimmung mit den Regeln auf administrator.de, wenn ich meine Beiträge, in denen ich noch Änderungen oder Erweiterungen vornehmen möchte, im selben Beitrag editiere, solange noch kein Beitrag auf diesen folgte, und dieses nicht als neues Posting erledige?
Gute Nacht
Fränky
Member: bastla
bastla Aug 26, 2007 at 08:48:18 (UTC)
Goto Top
Hallo Fraenky!

Das Script kommt in der aktuellen Fassung mit Linkzeilen folgenden Aufbaues zurecht:
<...Tags oder whatever...><... Weiteres ..."URL/URL/URL/URL/URL"... sogar hier dürfte Text enthalten sein ...>Link-Text<... und noch mehr für die Verarbeitung Belangloses ...>  
Diese werden mit "Split()" anhand der Anführungszeichen (werden nur als Trennzeichen betrachtet und scheinen im Ergebnis daher nicht auf) wie folgt in einzelne (indizierte) Variable aufgeteilt:

aZeile(0)<...Tags oder whatever...><... Weiteres ...
aZeile(1)URL/URL/URL/URL/URL
aZeile(2)... sogar hier dürfte Text enthalten sein ...>LinkText<... und noch mehr für die Verarbeitung Belangloses ...>

Der Bestandteil "aZeile(1)" enthält bereits die URL (eventuelle Leerzeichen am Beginn oder am Ende der URL könnten noch mit "Trim()" entfernt werden) und wird daher unverändert in die "DataList" übernommen.

Aus dem Teil "aZeile(2)" muss der Link-Text herausgefiltert werden, indem anhand von "<" (als "hinteres" Trennzeichen verwendet) zunächst
... sogar hier dürfte Text enthalten sein ...>LinkText
in "sText" zwischengespeichert und dann alles nach dem letzten (idR einzigen) ">" als endgültiger Link-Text in "sText" geschrieben wird:
LinkText
Auch hier könnte noch ein zusätzliches "Trim()" Leerstellen an den Rändern eliminieren - die ergänzte Zeile würde dann so aussehen:
sText = Trim(Mid(sText, InStrRev(sText, ">") + 1))  

Alle Link-Zeilen, die dem anfangs beschriebenen Aufbau nicht entsprechen, werden entweder nicht (bei <> 2 Anführungszeichen) verarbeitet oder führen können zB bei der Zerlegung von "aZeile(2)" zu Script-Fehlern oder fehlerhaften Ergebniszeilen führen. Beispiel für letzteres:
<p><a href="URL/URL/URL/URL/URL">Link-Text/a></p>  
brächte wegen des fehlenden "<" unmittelbar nach dem Link-Text folgendes Zerlegungs-Ergebnis:
Link-Text/a>

Wenn Du also solche fehlerhafte "Original"-Zeilen findest, dann poste diese bitte - mit Andeutungen über fehlerhafte Ergebnisse kann hier wohl niemand etwas anfangen ...

Heist, alle Doppelnamen wie Rei_Jagube.php">Rei Jagube</a><br> werden ausgelassen
Wenn der (nicht dargestellte) erste Teil der Zeile keinen Fehler aufweist, werden natürlich auch solche Links richtig zerlegt.

... im selben Beitrag editiere, solange noch kein Beitrag auf diesen folgte ...
... was nicht bedeutet, dass er noch nicht gelesen wurde und sich Antworten daher auf den "alten" Stand beziehen.

Kleinere Änderungen (etwa in der Wortwahl oder zur Korrektur von Rechtschreibfehlern) nehme ich auch en passant vor, bei tiefgreifenderen Änderungen/Ergänzungen ist ein Zusatz wie [Edit] Code-Zeile XYZ ergänzt [/Edit] das Mindeste, was ich selbst verwende - ein weiterer Kommentar hat zusätzlich den Vorteil, dass er (über die Mail-Benachrichtigung) auf die Änderung/Ergänzung aufmerksam macht.

Grüße
bastla
Member: Fraenky
Fraenky Aug 26, 2007 at 12:58:03 (UTC)
Goto Top
Hallo Bastla.
Hier einmal eine Zusammenstellung der Ausnahmen bezüglich des Inhalts der Links. Wird in Zukunft am Anfang geliefert.


<p><a href="../../../Pfad/Aben%E7oando.php">Aben&ccedil;oando</a></p>  
<p><a href="../../../Pfad/aberta.php">aberta</a></p>  
  <a href="../../../Pfad/Adam.php">Adam</a><br>  
<p><a href="../../../Pfad/Ain_Soph.php">Ain   
  Soph</a><br>
  <a href="../../../Pfad/Alafim_ex%EA.php">Alafim   
  ex&ecirc;</a></p>
<p> <a href="../../../Pfad/Flor_de_Jasmim.php">Flor   
  de Jasmim</a></p>

<a href="../../../Pfad/Ganhou.php">Ganhou</a>   
  <br>
  <a href="../../../Pfad/Geburah.php">Geburah</a><br>  

<a href="../../../Pfad/Kau%F3.php">Kau&oacute;</a><a href="../../../Pfad/Kether.php"><br>  
  Kether<br>
  </a><a href="../../../Pfad/Kolibri.php">Kolibri</a><br>  

<p><a href="../../../Pfad/M%E3e_Natureza.php">M&atilde;e   
  Natureza</a></p>
<p><a href="../../../Pfad/M%E3e_Protetora.php">M&atilde;e   
  Protetora</a></p>

<p><a href="../../../Pfad/Pai_Oxossi.php">Pai   
  Oxossi</a><br>
  <a href="../../../Pfad/Pai_Tom%E9.php">Pai   
  Tom&eacute;</a><br>
  <a href="../../../Pfad/Pai_Xang%F4.php">Pai   
  Xang&ocirc;</a></p>

<p>bbb</p>  //Kennz. für Buchstabensektion a-z

Löschen 
Und Leerzeichen dazwischen
<p>&nbsp;</p>

Diese Strukturen können in den unterschiedlichsten Kombinationen auftauchen.
Bein der Durchsicht viel auf, das keine einzige Zeile <p><a href=""></a></p> enthielt, was mich in der Auffassung bestärkt, dass hier Links verloren gingen. Es fehlen aZeile(1)/(2)
Merksatz: Analysiere die Datenstruktur, finde möglichst alle charakteristische Ausnahmen, bilde daraus eine Testdatei und übergebe diese rechtzeitig deinem Mentor.
EDIT Habe diesen Beitrag geschrieben, bevor ich Deinen gesehen habe.EDIT

Grüße
Fränky
Member: Fraenky
Fraenky Aug 26, 2007 at 13:56:47 (UTC)
Goto Top
Hallo Bastla.
Versuch einer Interpretation.

sUnsortiert = "C:\skript\Liste_sort\liste.txt" 'Quelldatei  
sSortiert = "C:\skript\Liste_sort\Sortiert.txt"     'Zieldatei  
Hier wird also den Konstanten? der entsprechende Pfad zugewiesen.


Const ForReading = 1, ForWriting = 2, ForAppending = 8 'Öffnungsarten für Textdateien  
Hier wird mit den Zahlen Zugriffsrechte zugewiesen, wie nur lesen, nur schreiben usw
Set fso = CreateObject("Scripting.FileSystemObject") 'für Dateisystemzugriffe  
Was sind Dateisystemzugriffe?


Const adVarChar = 200
Const MaxCharacters = 255
Const adFldIsNullable = 32

Hier werden den Constanten Namen und Länge zugewiesen


Set DataList = CreateObject("ADOR.Recordset") 'Datenbankobjekt erstellen  
Hier wird DataList ein Objekt m wahrscheinlich zur Sortierung, zugewiesen

DataList.Fields.Append "URL", adVarChar, MaxCharacters, adFldIsNullable  'Feld "URL" definieren  
Hier werden die Datenfelder definiert Name URL, Variable Zeichen, Alle Zeichen aufnehmen, das adFldIsNullable sagt mir nichts.
DataList.Fields.Append "Text", adVarChar, MaxCharacters, adFldIsNullable 'Feld "Text" definieren  
Hier wird der dritte Teil definiert
DataList.Open
Die DataList wird geöffnet, ist also zur Aufnahme der Sätze bereit.


Set oUnsortiert = fso.OpenTextFile(sUnsortiert, ForReading) 'Unsortierte Datei zum Lesen öffnen  
Setze Quelldatei = Dateisystemzugriff Öffnen ( Quelldatei, ForReading = 1)


Do While Not oUnSortiert.AtEndOfStream 'Schleife bis zum Dateiende  
Mache, weil nicht Quelldatei am Ende
Loop
Beendet Schleife


DataList.AddNew 'neuen Datensatz erstellen  
Hier wird jetzt dem geöffneten 'Datenbankobjekt Inhalt gegeben  


aZeile = Split(oUnsortiert.ReadLine, """") 'Zeile einlesen und an den Anführungszeichen zerteilen  
Namen aZeile wird Inhalt zugewiesen = Teile( Quelldatei.Zeile des Kursors an den Stellen, die in "" stehen  


If UBound(aZeile) = 2 Then '2 Anführungszeichen gefunden - 3 Teile:  
Wenn geteilte Zeile = 2 (0,1,2) dann folgendes


'1. Teil = aZeile(0): alles vor URL (vor dem ersten Anführungszeichen)  
'2. Teil = aZeile(1): URL (gefunden zwischen Anführungszeichen)  
'3. Teil = aZeile(2): alles nach URL (nach dem zweiten Anführungszeichen)  

Hier werden die Teile den Namen zugewiesen


'Zerlegung des 3. Teiles:  
Notwendig, weil dieser Teil ja mehr als den gewünschten Namen enthält
>Verdadeira</a></p>

sText = Left(aZeile(2), InStr(aZeile(2), "<") ) 'bis zum ersten "<"  
Variable? sText wird zugewiesen= Text von links gelesen bis <
sText = >Verdadeira

sText = Mid(sText, InStrRev(sText, ">") + 1) 'ab dem letzten ">"  
Hier wird das erste Zeichen entfernt
sText = Verdadeira


DataList("URL") = aZeile(1) 'Feld "URL" befüllen  
Hier wird in das Datenbankobjekt DataList Feld URL der 2.Teil eingetragen

DataList("Text") = sText    'Feld "Text" befüllen  
Hier wird in das Datenbankobjekt DataList Feld sText der 3 Teil eingetragen

DataList.Update '...  und Datensatz eintragen  
Satz wird in Datenbankobjekt eintragen


Else
Wenn anderer Satzaufbau, also keine "" vorhanden  

End If
Wann ist die Bedingung erfüllt?


R = MsgBox("Sortierung nach Name (Ja) oder nach URL (Nein)?", vbYesNo)  
Variable? R wird das Ergebnis des Fensters zugewiesen, Art des Fensters Ja Nein

If R = vbYes Then
Wenn Variable R = Ja, sortiere nach Text = Linkname
	DataList.Sort = "Text"  
Else
Oder sortiere nach URL
	DataList.Sort = "URL"	  
End If
Ende, wenn kein Satz mehr kommt


Set oSortiert = fso.OpenTextFile(sSortiert, ForWriting, True)
Erstelle Datei oSortiert , öffne Datei, zum schreiben, ohne Nachfrage


DataList.MoveFirst 'beim ersten Datensatz beginnen ...  
Nimmt den ersten Datensatz im Datenbankobjekt 

Do Until DataList.EOF '... und bis zum letzten durchgehen  
Mache solange bis DataList ist EndOfFile

	oSortiert.WriteLine "<p><a href=""" & _  
Hier wird in Datei oSortiert an Kurserposition eingefügt <p><a href=" + URL + Name + "</a></p>"  
		DataList.Fields.Item("URL") & _  
		""">" & _  
		DataList.Fields.Item("Text") & _  
		"</a></p>"  


DataList.MoveNext
Der nächst Datensatz wird angesteuert

Loop
Solange, bis wahrscheinlich kein Datensatz mehr vorhanden ist

oSortiert.Close
Am Ende, fein säuberlich, die sortierte Datei schließen.
Sieht doch schon mal ganz gut aus, finde ich.
War natürlich nur wegen Deiner guten Kommentierung möglich.
Danke dafür.

Alles Gute
Fränky
Member: Fraenky
Fraenky Aug 26, 2007 at 16:37:37 (UTC)
Goto Top
Hallo Bastla.
Jetzt kann ich endlich den Fehler reproduzieren.
Wenn bei der Abfrage mit Nein geantwortet wird, produziert es den angesprochenen Fehler.
LinkText<
Fehler gefunden
Zeile Zeile 56 ist ein > mit eingeschlossen.
Ein erster gefundener Fehler face-smile
Leider ohne Auswirkungen aufs Ergebnis.

Erste Zeilen Nein

<p><a href=""</a></p>  
<p><a href=""</a></p>  
<p><a href=""</a></p>  
<p><a href=""</a></p>  
<p><a href="../../../Pfad/%C1gua.php"&Aacute;gua<</a></p>  

Erste Zeilen Ja

<p><a href=""</a></p>  
<p><a href=""</a></p>  
<p><a href=""</a></p>  
<p><a href=""</a></p>  
<p><a href="../../../Pfad/Ain_Soph.php"</a></p>  

Das wird wohl an der Codierung liegen.
Liebe Grüße
Fränky
Member: bastla
bastla Aug 26, 2007 at 17:21:58 (UTC)
Goto Top
Hallo Fraenky!

Erklärung für die vielen leeren Links: In Deinem Script befindet sich die Zeile
        DataList.AddNew 'neuen Datensatz erstellen  
zweimal - wie schon in der Erklärung für das Posten des gesamten Codeblockes (den Du anscheinend nicht übernommen, sondern versucht hast, selbst anzupassen) angeführt, muss diese Zeile nach unten zu den übrigen "DataList"-Zeilen verschoben werden und darf daher an der ursprünglichen Position unmittelbar nach
Do While Not oUnSortiert.AtEndOfStream 'Schleife bis zum Dateiende  
nicht mehr enthalten sein.

Zu Deinen "Problemlinks" (auch für Text, der nicht durch die Forumssoftware verändert werden soll, empfiehlt sich das Posten in einem < code>-Block):
<p><a href="../../../Pfad/Aben%E7oando.php">Aben&ccedil;oando</a></p>  
<p><a href="../../../Pfad/aberta.php">aberta</a></p>  
<a href="../../../Pfad/Adam.php">Adam</a><br>  
<p><a href="../../../Pfad/Ain_Soph.php">Ain Soph</a><br>  
<a href="../../../Pfad/Alafim_ex%EA.php">Alafim ex&ecirc;</a></p>  
<p> <a href="../../../Pfad/Flor_de_Jasmim.php">Flor de Jasmim</a></p>  
<a href="../../../Pfad/Ganhou.php">Ganhou</a><br>  
<a href="../../../Pfad/Geburah.php">Geburah</a><br>  
<a href="../../../Pfad/Kau%F3.php">Kau&oacute;</a><a href="../../../Pfad/Kether.php"><br>Kether<br>  
</a><a href="../../../Pfad/Kolibri.php">Kolibri</a><br>  
<p><a href="../../../Pfad/M%E3e_Natureza.php">M&atilde;e Natureza</a></p>  
<p><a href="../../../Pfad/M%E3e_Protetora.php">M&atilde;e Protetora</a></p>  
<p><a href="../../../Pfad/Pai_Oxossi.php">Pai Oxossi</a><br>  
<a href="../../../Pfad/Pai_Tom%E9.php">Pai Tom&eacute;</a><br>  
<a href="../../../Pfad/Pai_Xang%F4.php">Pai Xang&ocirc;</a></p>  
als "Unsortiert.txt" bringt (mit jedem der beiden Sortierkriterien) folgende "Sortiert.txt":
<p><a href="../../../Pfad/Aben%E7oando.php">Aben&ccedil;oando</a></p>  
<p><a href="../../../Pfad/aberta.php">aberta</a></p>  
<p><a href="../../../Pfad/Adam.php">Adam</a></p>  
<p><a href="../../../Pfad/Ain_Soph.php">Ain Soph</a></p>  
<p><a href="../../../Pfad/Alafim_ex%EA.php">Alafim ex&ecirc;</a></p>  
<p><a href="../../../Pfad/Flor_de_Jasmim.php">Flor de Jasmim</a></p>  
<p><a href="../../../Pfad/Ganhou.php">Ganhou</a></p>  
<p><a href="../../../Pfad/Geburah.php">Geburah</a></p>  
<p><a href="../../../Pfad/Kolibri.php">Kolibri</a></p>  
<p><a href="../../../Pfad/M%E3e_Natureza.php">M&atilde;e Natureza</a></p>  
<p><a href="../../../Pfad/M%E3e_Protetora.php">M&atilde;e Protetora</a></p>  
<p><a href="../../../Pfad/Pai_Oxossi.php">Pai Oxossi</a></p>  
<p><a href="../../../Pfad/Pai_Tom%E9.php">Pai Tom&eacute;</a></p>  
<p><a href="../../../Pfad/Pai_Xang%F4.php">Pai Xang&ocirc;</a></p>  
Natürlich fehlen die beiden Links aus der Zeile
<a href="../../../Pfad/Kau%F3.php">Kau&oacute;</a><a href="../../../Pfad/Kether.php"><br>Kether<br>  
da diese Zeile nicht genau 2 Anführungszeichen enthält. Würde zwischen "</a>" und "<a>" eine Zeilenschaltung vorgenommen, wären natürlich auch diese (dadurch erkennbaren) beiden Links im Ergebnis enthalten.
LinkText<
Fehler gefunden
ist mir ziemlich unklar - für welche Linkzeile entsteht der Fehler, wie wirkt er sich genau aus?

Zeile Zeile 56 ist ein > mit eingeschlossen.
Das in Zeile 56 eingeschlossene > ist erforderlich, um
<a href="URL  
nicht nur um das schließende Anführungszeichen, sondern auch um das > zum Schließen des "<a>"-Tags zu ergänzen, woraus sich
<a href="URL">  
ergibt.

Danach folgt dann (in Zeile 57) das Hinzufügen des Link-Textes - was also wäre daran falsch?

Grüße
bastla
Member: Fraenky
Fraenky Aug 26, 2007 at 18:44:59 (UTC)
Goto Top
Hallo Bastla.
Die bei den vielen leer Links hatte ich eine ältere Version des Scripts zufälliger Weise eingesetzt, da stand die Zeile DataList.AddNew noch oben.
Jetzt, beim richtigen.vbs habe ich aber immer noch ca 270 leer Links am Anfang.
Wenn sicher ist, das sich diese nicht aus irgendwie rausgefallenen Links ergeben, ist das kein Problem, obwohl ich als Anfänger schon den Grund kennen möchte.

Zu dem angeblichen Fehler:
Habe ich wohl wieder < und > verwechselt
< taucht fälchlicherweise beim Linknamen mit auf, wie im Posting von 18:37:37 ersichtlich, wenn Abfrage mit Nein beantwortet wird.
Und da habe ich wohl voller Freude, einen Fehler gefunden zu haben """>"
nicht mehr richtig hingeschaut. Wie, gesagt, ist ein neues Feld für mich, Anfängerfehler.
Der Code funktioniert aber auch ohne >

Grüße
Fränky
Member: bastla
bastla Aug 26, 2007 at 19:05:04 (UTC)
Goto Top
Hallo Fraenky!

Zu Deinem "Versuch einer Interpretation": Ich beschränke mich auf Ergänzungen / Richtigstellungen - die nicht kommentierten Interpretationen sind OK

sUnsortiert = "C:\skript\Liste_sort\liste.txt" 'Quelldatei
sSortiert = "C:\skript\Liste_sort\Sortiert.txt" 'Zieldatei
Hier wird also den Konstanten? der entsprechende Pfad zugewiesen.
De facto Konstanten, da die Pfade im weiteren Script nicht geändert werden - formal betrachtet wäre für eine "echte" Konstante noch das Schlüsselwort "Const" voranzustellen, was ich aber bei Dateinamen/-pfaden oft unterlasse, um diese bei Bedarf im Programmablauf noch ändern zu können (zB mit einem "Speichern unter ..."-Dialog) - daher vielleicht bessere Bezeichnung: "Defaultwerte"

Const ForReading = 1, ForWriting = 2, ForAppending = 8 'Öffnungsarten für Textdateien
Hier wird mit den Zahlen Zugriffsrechte zugewiesen, wie nur lesen, nur schreiben usw
Diese Konstanten dienen nur dazu, den weiteren Code lesbarer zu machen (siehe "OpenTextFile") - es können natürlich auch die Zahlenwerte in der "Open"-Anweisung verwendet werden

Set fso = CreateObject("Scripting.FileSystemObject") 'für Dateisystemzugriffe
Was sind Dateisystemzugriffe?
Neben dem Kopieren, Löschen, Verschieben, Umbenennen von Dateien auch das Öffnen von Textdateien zum Lesen, Schreiben, am Ende Anfügen ...

Const adVarChar = 200
Const MaxCharacters = 255
Const adFldIsNullable = 32
Hier werden den Constanten Namen und Länge zugewiesen
Wie oben - Lesbarkeit, aber auch Wartbarkeit (leichtere Änderung von Werten) verbessern

Set DataList = CreateObject("ADOR.Recordset") 'Datenbankobjekt erstellen
Hier wird DataList ein Objekt m wahrscheinlich zur Sortierung, zugewiesen
Zur Datenverwaltung, wozu auch die Sortierung zählt - eigentlicher Anlass für die Verwendung dieses Objektes

DataList.Fields.Append "URL", adVarChar, MaxCharacters, adFldIsNullable 'Feld "URL" definieren
Hier werden die Datenfelder definiert Name URL, Variable Zeichen, Alle Zeichen aufnehmen, das adFldIsNullable sagt mir nichts.
Kann ich auch nicht mit Sicherheit sagen (der Code ist bekanntlich nicht von mir), sollte aber bedeuten, dass auch der Wert "Null" (= noch weniger als kein Inhalt, nämlich: Wert "existiert nicht") für dieses Feld verwendet werden darf

DataList.Fields.Append "Text", adVarChar, MaxCharacters, adFldIsNullable 'Feld "Text" definieren
Hier wird der dritte Teil definiert
DataList.Open
Die DataList wird geöffnet, ist also zur Aufnahme der Sätze bereit.

Set oUnsortiert = fso.OpenTextFile(sUnsortiert, ForReading) 'Unsortierte Datei zum Lesen öffnen
Setze Quelldatei = Dateisystemzugriff Öffnen ( Quelldatei, ForReading = 1)
Unsortierte Datei (=Quelldatei) zum Lesen öffnen, wird in weiterer Folge als "oUnsortiert" angesprochen

Do While Not oUnSortiert.AtEndOfStream 'Schleife bis zum Dateiende
Mache, weil nicht Quelldatei am Ende
Führe die Schleife (den Teil bis "Loop") aus, solange nicht das Dateiende erreicht ist (und es daher keine weiteren Datensätze gibt); einfacher: Verarbeite alle Datensätze
Loop
Beendet Schleife

DataList.AddNew 'neuen Datensatz erstellen
Hier wird jetzt dem geöffneten 'Datenbankobjekt Inhalt gegeben
Noch kein Inhalt; es wird nur eine neuer leerer Datensatz erstellt - wie im vorigen Kommentar erwähnt, sollte diese Zeile an dieser Stelle nicht mehr stehen.

aZeile = Split(oUnsortiert.ReadLine, """") 'Zeile einlesen und an den Anführungszeichen zerteilen
Namen aZeile wird Inhalt zugewiesen = Teile( Quelldatei.Zeile des Kursors an den Stellen, die in "" stehen
Es werden entsprechend der Anzahl der Trennzeichen (hier das Anführungszeichen) einzelne nummerierte (Fachbegriff "indizierte") Variable erstellt - der Index ist 0-basiert, das erste Element heißt daher aZeile(0)

If UBound(aZeile) = 2 Then '2 Anführungszeichen gefunden - 3 Teile:
Wenn geteilte Zeile = 2 (0,1,2) dann folgendes
UBound = Upper Bound = Obergrenze = höchster Indexwert
Da die Zählung bei 0 beginnt, wird hier auf 2 (für insgesamt 3 Teile) geprüft und nur dann wie folgt verarbeitet

'1. Teil = aZeile(0): alles vor URL (vor dem ersten Anführungszeichen)
'2. Teil = aZeile(1): URL (gefunden zwischen Anführungszeichen)
'3. Teil = aZeile(2): alles nach URL (nach dem zweiten Anführungszeichen)
Hier werden die Teile den Namen zugewiesen
Die Teile wurden bereits oben zugewiesen - das sind nur Kommentarzeilen (erkennbar am einzelnen Apostroph)

'Zerlegung des 3. Teiles:
Notwendig, weil dieser Teil ja mehr als den gewünschten Namen enthält
>Verdadeira</a></p>

sText = Left(aZeile(2), InStr(aZeile(2), "<") ) 'bis zum ersten "<"
Variable? sText wird zugewiesen= Text von links gelesen bis <
sText = >Verdadeira

sText = Mid(sText, InStrRev(sText, ">") + 1) 'ab dem letzten ">"
Hier wird das erste Zeichen entfernt
sText = Verdadeira
Hatte ich früher schon genauer beschrieben - in diesem Beispiel wird das erste Zeichen entfernt, wäre "sText" etwa
><br>Verdadeira
würde auch "<br>" entfernt (ab dem letzten ">", also von rechts betrachtet dem ersten gefundenen ">")

DataList("URL") = aZeile(1) 'Feld "URL" befüllen
Hier wird in das Datenbankobjekt DataList Feld URL der 2.Teil eingetragen

DataList("Text") = sText 'Feld "Text" befüllen
Hier wird in das Datenbankobjekt DataList Feld sText der 3 Teil eingetragen

DataList.Update '... und Datensatz eintragen
Satz wird in Datenbankobjekt eintragen

Else
Wenn anderer Satzaufbau, also keine "" vorhanden
End If
Wann ist die Bedingung erfüllt?
Wenn nicht genau 2 Anführungszeichen festgestellt wurden - dafür steht die Vorgangsweise noch nicht fest, daher nach dem "Else" kein Code

Das Gesamtkonstrukt umfasst also:
If "Bedingung(en)" Then  
	Code für "Bedingung(en) erfüllt"  
Else
	Code für "Bedingung(en) nicht erfüllt"  
End If

R = MsgBox("Sortierung nach Name (Ja) oder nach URL (Nein)?", vbYesNo)
Variable? R wird das Ergebnis des Fensters zugewiesen, Art des Fensters Ja Nein

If R = vbYes Then
Wenn Variable R = Ja, sortiere nach Text = Linkname
DataList.Sort = "Text"
Else
Oder sortiere nach URL
DataList.Sort = "URL"
End If
Ende, wenn kein Satz mehr kommt
Nur Ende des "If" - "Then" - "Else" - "End If" - Konstruktes (siehe oben)

Set oSortiert = fso.OpenTextFile(sSortiert, ForWriting, True)
Erstelle Datei oSortiert , öffne Datei, zum schreiben, ohne Nachfrage
Exakter (aber im Ergebnis gleich): Öffne Textdatei mit dem in "sSortiert" gespeicherten Pfad zum Schreiben, überschreibe bei Bedarf eine bereits vorhandene Datei und stelle zum Zugriff auf diese Datei das Objekt "oSortiert" bereit

DataList.MoveFirst 'beim ersten Datensatz beginnen ...
Nimmt den ersten Datensatz im Datenbankobjekt

Do Until DataList.EOF '... und bis zum letzten durchgehen
Mache solange bis DataList ist EndOfFile
Wie oben beim Lesen aus der Textdatei - führe die Schleife aus, solange das Datenbankende nicht erreicht ist; daher wieder: verwende alle Datensätze

oSortiert.WriteLine "<p><a href=""" & _
DataList.Fields.Item("URL") & _
""">" & _
DataList.Fields.Item("Text") & _
"</a></p>"
Hier wird in Datei oSortiert an Cursorposition eingefügt <p><a href=" + URL + "> + Name + "</a></p>"
Bedingt durch die "ominöse" Zeile 56 wird auch auch "> eingefügt

"oSortiert.WriteLine" bedeutet: Schreibe den folgenden Text als abgeschlossene Zeile in die mit "oSortiert" angesprochene Textdatei

Der Übersichtlichkeit wegen habe ich das "Zusammenbauen" der Zeile auf mehrere Quelltextzeilen verteilt - durch das " _" am Ende werden aber die einzelnen Zeilen als eine zusammenhängende Codezeile interpretiert (VBS arbeitet codezeilenorientiert)

" _" ist auch gut geeignet, um lange Codezeilen (an geeigneter Stelle) einfach (der Optik oder besseren Darstellbarkeit wegen) umbrechen zu können

DataList.MoveNext
Der nächst Datensatz wird angesteuert

Loop
Solange, bis wahrscheinlich kein Datensatz mehr vorhanden ist
Genau genommen wird hier nur das Schleifenende angezeigt - die Überprüfung, ob das Dateiende erreicht ist, wird im Schleifenkopf ("Do While ...") vorgenommen

oSortiert.Close
Am Ende, fein säuberlich, die sortierte Datei schließen.
... um sicher zu stellen, dass alle Daten auch auf das Speichermedium (hier konkret: auf die Festplatte) geschrieben wurden - bei schreibendem Zugriff (ForWriting, ForAppending) immer das "Close" durchführen

Grüße
bastla
Member: bastla
bastla Aug 26, 2007 at 19:47:42 (UTC)
Goto Top
Hallo Fraenky!

Wenn sicher ist, das sich diese nicht aus irgendwie rausgefallenen Links ergeben, ist das kein Problem, obwohl ich als Anfänger schon den Grund kennen möchte.
Sicher kannst Du am ehesten sein, wenn eine Protokollierung der nicht verarbeiteten Sätze erfolgt - ich baue das mal ein ...

Um einen Überblick zu erhalten, musst Du eigentlich nur mit einem Editor die Zeilenanzahl der beiden Dateien "Unsortiert.txt" und "Sortiert.txt" vergleichen - die Zeilenanzahl von "Sortiert.txt" kannst Du auch mit der Zeile
MsgBox "Anzahl der Datensätze im Ergebnis: " & DataList.RecordCount  
ausgeben.

Zur Sicherheit vielleicht nochmals der von mir bei den Tests verwendete (und wie oben beschrieben ergänzte) Letztstand des Scriptcodes (mit an Deinen Arbeitsordner angepassten Pfaden - ich verwende immer noch "D:\Unsortiert.txt" als Ausgangsdatei):
sUnsortiert = "C:\skript\Liste_sort\liste.txt"    'Quelldatei  
sSortiert = "C:\skript\Liste_sort\Sortiert.txt"   'Zieldatei  
sProtokoll = "C:\skript\Liste_sort\Protokoll.txt" 'Protokoll für nicht verarbeitete Sätze  

Const ForReading = 1, ForWriting = 2, ForAppending = 8 'Öffnungsarten für Textdateien  
Set fso = CreateObject("Scripting.FileSystemObject") 'für Dateisystemzugriffe  

'für die Definition der Datenfelder (siehe verlinkter Artikel)  
Const adVarChar = 200
Const MaxCharacters = 255
Const adFldIsNullable = 32

Set DataList = CreateObject("ADOR.Recordset") 'Datenbankobjekt erstellen  
DataList.Fields.Append "URL", adVarChar, MaxCharacters, adFldIsNullable  'Feld "URL" definieren  
DataList.Fields.Append "Text", adVarChar, MaxCharacters, adFldIsNullable 'Feld "Text" definieren  
DataList.Open

Set oUnsortiert = fso.OpenTextFile(sUnsortiert, ForReading) 'Unsortierte Datei zum Lesen öffnen  
Set oProtokoll = fso.OpenTextFile(sProtokoll, ForWriting, True) 'Protokolldatei zum Schreiben öffnen; altes Protokoll überschreiben  
Do While Not oUnSortiert.AtEndOfStream 'Schleife bis zum Dateiende  
	aZeile = Split(oUnsortiert.ReadLine, """") 'Zeile einlesen und an den Anführungszeichen zerteilen  
	If UBound(aZeile) = 2 Then '2 Anführungszeichen gefunden - 3 Teile:  
		'1. Teil = aZeile(0): alles vor URL (vor dem ersten Anführungszeichen)  
		'2. Teil = aZeile(1): URL (gefunden zwischen Anführungszeichen)  
		'3. Teil = aZeile(2): alles nach URL (nach dem zweiten Anführungszeichen)  

		'Zerlegung des 3. Teiles:  
		sText = Left(aZeile(2), InStr(aZeile(2), "<") - 1) 'bis zum ersten "<"  
		sText = Mid(sText, InStrRev(sText, ">") + 1) 'ab dem letzten ">"  
		If aZeile(1) <> "" Or sText <> "" Then  
			DataList.AddNew 'neuen Datensatz erstellen  
			DataList("URL") = aZeile(1) 'Feld "URL" befüllen  
			DataList("Text") = sText    'Feld "Text" befüllen   
			DataList.Update '...  und Datensatz eintragen  
		Else
			'Eintrag in das Protokoll:  
				'Alle Teile zusammenfassen,  
				'dabei die entfernten Anführungszeichen wieder einfügen und  
				'Zeile in Protokolldatei schreiben  
			oProtokoll.WriteLine Join(aZeile, """")  
		End If
	Else
		'anderer Zeilenaufbau - wäre näher zu untersuchen  
		'zumindest Protokolleintrag erstellen  
		oProtokoll.WriteLine Join(aZeile, """")  
	End If
Loop
oUnsortiert.Close 'Eingabedatei schließen  
oProtokoll.Close 'Protokolldatei schließen  
'Sortierkriterium feststellen - Billigvariante ;-)  
R = MsgBox("Sortierung nach Name (Ja) oder nach URL (Nein)?", vbYesNo)  
If R = vbYes Then
	DataList.Sort = "Text"  
Else
	DataList.Sort = "URL"	  
End If

'Zieldatei öffnen; ev bereits vorhandene Datei überschreiben  
Set oSortiert = fso.OpenTextFile(sSortiert, ForWriting, True)
DataList.MoveFirst 'beim ersten Datensatz beginnen ...  
Do Until DataList.EOF '... und bis zum letzten durchgehen  
	'Ausgabezeile zusammensetzen und schreiben  
	oSortiert.WriteLine "<p><a href=""" & _  
		DataList.Fields.Item("URL") & _  
		""">" & _  
		DataList.Fields.Item("Text") & _  
		"</a></p>"  
	'nächsten Datensatz auswählen  
	DataList.MoveNext
Loop
'Ausgabedatei schließen  
oSortiert.Close
'Anzahl Datensätze ausgeben  
MsgBox "Anzahl der Datensätze im Ergebnis: " & DataList.RecordCount  

Grüße
bastla
Member: Fraenky
Fraenky Aug 26, 2007 at 20:35:32 (UTC)
Goto Top
Hallo Bastla.
Danke für Deine Ergänzungen. Jetzt wird mir langsam einiges klarer.
Mit dem Befehl aZeile = Split(oUnsortiert.ReadLine, """")
wird also automatisch, je nach Anzahl der Teilungen, aZeile(0) bis aZeile(n) angelegt.
Sehr praktisch und kurz.
Hast Du denn auch unterschiedliche Ergebnisse, wenn Du einmal Im Anfragefenster mit Ja und einmal mit Nein antwortest?
Bei mir ist das so,
Ahh, jetzt weiß ich, wofür die -1 ist. Erledigt.
Doppelte Links werden doppelt eingetragen..
Kann man dieses durch Operationen in der Datenbank verhindern, oder muß das an anderer Stelle geschehen.
Mit den Leerzeilen am Anfang der Ausgabedatei gehe ich davon aus, das der Mustersatz, also ohne Teil 2 und 3, am Anfang jedes Loops einmal geschrieben wird.
Grüße
Fränky
Member: bastla
bastla Aug 26, 2007 at 21:12:47 (UTC)
Goto Top
Hallo Fraenky!

Hast Du denn auch unterschiedliche Ergebnisse, wenn Du einmal Im Anfragefenster mit Ja und einmal mit Nein antwortest?
Mit den bisher zur Verfügung stehenden Testdaten wäre mir das nicht aufgefallen, wobei die unterschiedliche Sortierung ja eigentlich ohnehin nur die Reihung, aber nicht den Inhalt der Linkzeilen verändern dürfte ...

Teste bitte nochmals mit der vorhin von mir geposteten Script-Version!
Doppelte Links werden doppelt eingetragen..
Kann man dieses durch Operationen in der Datenbank verhindern, oder muß das an anderer Stelle geschehen.
Beide Möglichkeiten kommen in Frage. Ich werde mir die Tatsache zunutze machen, dass nach der Sortierung gleiche Links unmittelbar aufeinander folgen müssen - daher kann ich einfach mit den Daten des zuletzt ausgegebenen Datensatzes vergleichen, und wenn zumindest eines der beiden Datenfelder unterschiedlich ist, kann ich den aktuellen Datensatz ausgeben - im anderen Fall gehe ich ohne Ausgabe zum nächsten Satz weiter.

Allerdings muss ich aufgrund der Tatsache, dass uU nicht mehr alle Datensätze ausgegeben werden, einen eigenen Zähler für geschriebene Links einbauen.

Ersetze zu diesem Zweck den letzten Teil des Scripts durch den folgenden Block:
'Zieldatei öffnen; ev bereits vorhandene Datei überschreiben  
Set oSortiert = fso.OpenTextFile(sSortiert, ForWriting, True)
'Startwerte für Satzvergleich setzen  
sPrevURL = ""   
sPrevText = ""  
lCounter = 0 'Zähler für geschriebene Sätze  
DataList.MoveFirst 'beim ersten Datensatz beginnen ...  
Do Until DataList.EOF '... und bis zum letzten durchgehen  
	'Unterschied zum vorhergehenden Datensatz?  
	If DataList.Fields.Item("URL") <> sPrevURL Or _  
	   DataList.Fields.Item("Text") <> sPrevText Then  
		'keine Übereinstimmung beider Felder mit vorigem Datensatz, daher  
		'Ausgabezeile zusammensetzen und schreiben  
		oSortiert.WriteLine "<p><a href=""" & _  
			DataList.Fields.Item("URL") & _  
			""">" & _  
			DataList.Fields.Item("Text") & _  
			"</a></p>"  
		lCounter = lCounter + 1 'Zähler erhöhen  
		'letzte geschriebene Daten merken  
		sPrevURL = DataList.Fields.Item("URL")  
		sPrevText = DataList.Fields.Item("Text")  
	End If
	'nächsten Datensatz auswählen  
	DataList.MoveNext
Loop
'Ausgabedatei schließen  
oSortiert.Close
'Anzahl Datensätze ausgeben  
MsgBox "Anzahl der Datensätze im Ergebnis: " & CStr(lCounter)  

Grüße
bastla
Member: Fraenky
Fraenky Aug 26, 2007 at 21:37:51 (UTC)
Goto Top
Hallo Bastla.
Sehr übersichtlich Dein Block
Ich hoffe nicht, das Ich ihn ausfüllen soll
Edit Eben noch war Dein Block nur als graues Feld zu sehen, jetzt ist er klar Edit
Fränky
Member: Fraenky
Fraenky Aug 26, 2007 at 22:02:38 (UTC)
Goto Top
Hallo Bastla.
Hier ein Versuch mit meinen Worten

Set oSortiert = fso.OpenTextFile(sSortiert, ForWriting, True)
DataList.MoveFirst 'beim ersten Datensatz beginnen ...  
Set Zähler = 0, wenn erster Durchlauf +1
Do Until DataList.EOF '... und bis zum letzten durchgehen  
	'Ausgabezeile zusammensetzen und schreiben  
	oSortiert.WriteLine "<p><a href=""" & _  
		DataList.Fields.Item("URL") & _  
		"""" & _  
		DataList.Fields.Item("Text") & _  
		"</a></p>"  
copy Datensatz in Doppelcheck
copy nächsten Datensatz in Doppelcheck2
Vergleiche beide Datensätze
Wenn ungleich,  tue nichts und weiter
Wenn gleich, lösche Doppelcheck2 und lösche Doppelcheck
weiter
	'nächsten Datensatz auswählen  
	DataList.MoveNext
Loop

'Ausgabedatei schließen  
oSortiert.Close

Print Zähler
Vergleiche Zähler mit Anzahl Datensätze aus DataList
Wenn nicht gleich, Print in sSortiert am Ende:
In sSortiert sind x Datensätze weniger als in sUnsortiert
Dasselbe in einem Ausgabefenster
MsgBox( Text)

Gruß
Fränky
Member: Fraenky
Fraenky Aug 26, 2007 at 23:25:28 (UTC)
Goto Top
Hallo Bastla.
Verständnistest

Set oSortiert = fso.OpenTextFile(sSortiert, ForWriting, True)
'Startwerte für Satzvergleich setzen  
sPrevURL = ""   
sPrevText = ""  


sPrevURL ist ein frei wählbarer Name und kein Befehl, zugewiesen wird nichts 


lCounter = 0 'Zähler für geschriebene Sätze  
DataList.MoveFirst 'beim ersten Datensatz beginnen ...  
Do Until DataList.EOF '... und bis zum letzten durchgehen  
	'Unterschied zum vorhergehenden Datensatz?  
	If DataList.Fields.Item("URL") <> sPrevURL Or   


Wenn das Feld URL in der Datenbank ungleich sPrevURL oder

_
	   DataList.Fields.Item("Text") <> sPrevText   


Wenn das Feld URL in der Datenbank ungleich
sPrevText dann


Then
		'keine Übereinstimmung beider Felder mit vorigem Datensatz, daher  
		'Ausgabezeile zusammensetzen und schreiben  
		oSortiert.WriteLine "<p><a href=""" & _  
			DataList.Fields.Item("URL") & _  
			""">" & _  
			DataList.Fields.Item("Text") & _  
			"</a></p>"  
		lCounter = lCounter + 1 'Zähler erhöhen  
		'letzte geschriebene Daten merken  
		sPrevURL = DataList.Fields.Item("URL")  
		sPrevText = DataList.Fields.Item("Text")  


Hier wird in sPrevURL das Feld URL aus Datenbank zugewiesen. Dann müste der erste Durchlauf leer erfolgen.


	End If
	'nächsten Datensatz auswählen  
	DataList.MoveNext
Loop
'Ausgabedatei schließen  
oSortiert.Close
'Anzahl Datensätze ausgeben  
MsgBox "Anzahl der Datensätze im Ergebnis: " & CStr(lCounter)  


Leider ein Problem:
sUnsortiert =
<p><a href="../../../Pfad/Aben%E7a.php">Aben&ccedil;a</a></p>  
<p><a href="../../../Pfad/Aben%E7a.php">aben&ccedil;a</a></p>  
<p><a href="../../../Pfad/aben%E7oa.php">Aben&ccedil;oa</a></p>  
<p><a href="../../../Pfad/aben%E7oa.php">aben&ccedil;oa</a></p>  
<p><a href="../../../Pfad/aben%E7oada.php">aben&ccedil;oada</a></p>  
<p><a href="../../../Pfad/aben%E7oados.php">aben&ccedil;oados</a></p>  

<p><a href="../../../Pfad/Aben%E7a.php">Aben&ccedil;a</a></p>  
<p><a href="../../../Pfad/Aben%E7a.php">aben&ccedil;a</a></p>  
<p><a href="../../../Pfad/aben%E7oa.php">Aben&ccedil;oa</a></p>  
<p><a href="../../../Pfad/aben%E7oa.php">aben&ccedil;oa</a></p>  
<p><a href="../../../Pfad/aben%E7oada.php">aben&ccedil;oada</a></p>  
<p><a href="../../../Pfad/aben%E7oados.php">aben&ccedil;oados</a></p>  


sSortiert =
<p><a href="../../../Pfad/Aben%E7a.php">Aben&ccedil;a</a></p>  
<p><a href="../../../Pfad/Aben%E7a.php">aben&ccedil;a</a></p>  
<p><a href="../../../Pfad/Aben%E7a.php">Aben&ccedil;a</a></p>  
<p><a href="../../../Pfad/Aben%E7a.php">aben&ccedil;a</a></p>  
<p><a href="../../../Pfad/aben%E7oa.php">Aben&ccedil;oa</a></p>  
<p><a href="../../../Pfad/aben%E7oa.php">aben&ccedil;oa</a></p>  
<p><a href="../../../Pfad/aben%E7oa.php">Aben&ccedil;oa</a></p>  
<p><a href="../../../Pfad/aben%E7oa.php">aben&ccedil;oa</a></p>  
<p><a href="../../../Pfad/aben%E7oada.php">aben&ccedil;oada</a></p>  
<p><a href="../../../Pfad/aben%E7oados.php">aben&ccedil;oados</a></p>  

Klartext
Abença

abença

Abença

abença

Abençoa

abençoa

Abençoa

abençoa

abençoada

abençoados

Vieleicht sollte die Doppelprüfung doch in der Datenbank vorgenommen werden.

Viele Grüße
Fränky
Member: bastla
bastla Aug 27, 2007 at 07:13:39 (UTC)
Goto Top
Hallo Fraenky!

sPrevURL ist ein frei wählbarer Name und kein Befehl, zugewiesen wird nichts
"sPrevURL" ist der frei gewählte Name einer Variablen (eines benannten Speicherbereichs).

sPrevURL = DataList.Fields.Item("URL")
Hier wird in sPrevURL das Feld URL aus Datenbank zugewiesen. Dann müste der erste Durchlauf leer erfolgen.
Zu diesem Zeitpunkt ist der erste Durchlauf bereits erfolgt und der Datensatz wurde sicher geschrieben, da (siehe oben) der erste Vergleich mit einem "sPrevURL"- (und auch sPrevText-) Inhalt von "" erfolgte - damit wäre also nur das Schreiben eines Datensatzes mit sowohl leerer URL als auch leerem Link-Text verhindert worden - allerdings kann es einen solchen eigentlich gar nicht geben, da bereits beim Einlesen ausgefiltert.

Vieleicht sollte die Doppelprüfung doch in der Datenbank vorgenommen werden.
... was allerdings bei Vernachlässigigung der Groß-/Kleinschreibung auch kein anderes Ergebnis zeitigen würde, also sollte folgende Ergänzung genügen:
	If LCase(DataList.Fields.Item("URL")) <> LCase(sPrevURL) Or _  
	   LCase(DataList.Fields.Item("Text")) <> LCase(sPrevText Then)  
Der Vergleich erfolgt jetzt mit (temporär) in Kleinbuchstaben umgewandelten Werten ...

Grüße
bastla
Member: Fraenky
Fraenky Aug 27, 2007 at 08:33:04 (UTC)
Goto Top
Guten Morgen Bastla.
Ich möchte hier etwas zu einer möglichen Darstellungsänderung auf administrator.de vorschlagen.
Ab 20 Beiträgen sollte die Darstellungsweise der Postings im oberen Bereich geändert werden.
Also nicht mehr Einrücken des nächsten Postings, sondern links mit angezeigter fortlaufender Nummerrierung arbeiten mit weglassen der ganzen Re´s, die ja doch keinen Infogehalt mehr haben. Die jetzige Darstellungsweise macht das Fenster immer breiter.
In etwa so:
Abftage:
Wenn Anzahl Postings > 20
Schreibe Links laufende Nummer mit Titel und Autor

Grüße Fränky

P.S.
Ich kann also davon ausgehen, das bei Dir kein Problem bezüglich der Dopplugen auftrit,
Dann frage mich, woher die unterschiedlichen Ergebnisse beim Durchlaufen zwischen Deinem Rechner und meinem herkommen.

P.P.S
Das nachträgliche Einfügen des neuen Quellcodes im Posting vom 26.08.2007 um 21:47:42 hättest Du aber besser als neues Posting erledigt. Die nachfolgenden Postings bezogen sich alle auf den alten Stand, also wird es für einen Leser schwerer, alles nachzuvollziehen.
Member: bastla
bastla Aug 27, 2007 at 10:10:32 (UTC)
Goto Top
Hallo Fraenky!

Ich möchte hier etwas zu einer möglichen Darstellungsänderung auf administrator.de vorschlagen.
Hier ist nicht der richtige Ort dafür - es gibt in "Off Topic" einen "Feedback"-Bereich ...

... mit weglassen der ganzen Re´s ...
... was sich (ich fasse mich dabei durchaus an die eigene Nase) mit ein wenig Disziplin auch selbst erledigen lässt, abgesehen davon, dass nur eine minimale Zahl von Threads Umfänge wie dieser hier erreicht.

Ich kann also davon ausgehen, das bei Dir kein Problem bezüglich der Dopplugen auftrit,
Ohne jetzt auf Deine Definition von "Problem" näher eingehen zu wollen - nach dem Einfügen der Überprüfung mit "LCase()" wird bei mir aus "Unsortiert.txt"
<p><a href="../../../Pfad/Aben%E7a.php">Aben&ccedil;a</a></p>  
<p><a href="../../../Pfad/Aben%E7a.php">aben&ccedil;a</a></p>  
<p><a href="../../../Pfad/aben%E7oa.php">Aben&ccedil;oa</a></p>  
<p><a href="../../../Pfad/aben%E7oa.php">aben&ccedil;oa</a></p>  
<p><a href="../../../Pfad/aben%E7oada.php">aben&ccedil;oada</a></p>  
<p><a href="../../../Pfad/aben%E7oados.php">aben&ccedil;oados</a></p>  

<p><a href="../../../Pfad/Aben%E7a.php">Aben&ccedil;a</a></p>  
<p><a href="../../../Pfad/Aben%E7a.php">aben&ccedil;a</a></p>  
<p><a href="../../../Pfad/aben%E7oa.php">Aben&ccedil;oa</a></p>  
<p><a href="../../../Pfad/aben%E7oa.php">aben&ccedil;oa</a></p>  
<p><a href="../../../Pfad/aben%E7oada.php">aben&ccedil;oada</a></p>  
<p><a href="../../../Pfad/aben%E7oados.php">aben&ccedil;oados</a></p>  
folgende "Sortiert.txt":
<p><a href="../../../Pfad/Aben%E7a.php">Aben&ccedil;a</a></p>  
<p><a href="../../../Pfad/aben%E7oa.php">Aben&ccedil;oa</a></p>  
<p><a href="../../../Pfad/aben%E7oada.php">aben&ccedil;oada</a></p>  
<p><a href="../../../Pfad/aben%E7oados.php">aben&ccedil;oados</a></p>  
Damit habe ich kein Problem.

Bei Dir gibt es mit dem aktuellsten Script (inkl "LCase()") weiterhin doppelte Links im Ergebnis?

Grüße
bastla
Member: Fraenky
Fraenky Aug 27, 2007 at 10:54:17 (UTC)
Goto Top
Hallo Bastla.

Außer in Deinem letzten Posting habe ich bei dem Durchsuchen der Webseite mit LCase() keit LCase() gefunden. Ich verstehe also nicht Deinen letzten Hinweis auf "aktuellsten Script"
Die LCase-Funktion wandelt die Großbuchstaben einer Zeichenfolge in Kleinbuchstaben um, warum sollte das helfen, Dopplungen zu verhindern?
Gruß
Fränky
Member: bastla
bastla Aug 27, 2007, updated at Oct 18, 2012 at 16:32:22 (UTC)
Goto Top
Hallo Fraenky!

Manchmal ist weniger mehr - etwa beim Suchen: Die Funktion heißt "LCase()" und hat, wie standardmäßig jede Funktion, ein Paar Klammern. Zwischen diesen Klammern stehen (bei den allermeisten Funktonen) "Argumente" oder "Parameter", welche beim Suchen natürlich stören - deshalb wäre ein Suchbegriff "LCase(" vorteilhafter.

Andererseits wäre ich gar nicht auf die Idee gekommen, dass Du eine Suche starten müsstest, um diesen Kommentar zu finden, sondern hatte natürlich angenommen, dass Du die diesbezügliche Ergänzung bereits in das Script eingearbeitet hättest.

Die LCase-Funktion wandelt die Großbuchstaben einer Zeichenfolge in Kleinbuchstaben um, warum sollte das helfen, Dopplungen zu verhindern?
Das Problem mit den doppelten Links aus Deinem Beispiel oben resultiert daraus, dass eben
<p><a href="../../../Pfad/Aben%E7a.php">Aben&ccedil;a</a></p>  
und
<p><a href="../../../Pfad/Aben%E7a.php">aben&ccedil;a</a></p>  
nicht identisch sind ("Aben&ccedil;a" vs "aben&ccedil;a").

Bei einzelnen Funktionen gibt es einen Parameter, mit dem ein Ignorieren des Unterschiedes zwischen Groß- und Kleinschreibung erzwungen werden kann - ein einfaches "If" vergleicht aber immer exakt, daher ist es hier nötig, beide zu vergleichenden Texte auf einheitliche Schreibweise (Großschreibung oder Kleinschreibung ist dabei im Prinzip egal) umzustellen.

Grüße
bastla
Member: Fraenky
Fraenky Aug 27, 2007 at 13:06:36 (UTC)
Goto Top
Hallo Bastla.
Zu den Re´s wollte ich noch anmerken, das, da ja mein Posting diesbezüglich auf die Optik der Webseite bezogen war, ich selbstverständlich nur die Häufung der Re´s oben in der Webseite meinte, und die sind für den User vollkommen unerheblich und ohne Aussagekraft und ziehen die Webseite nur unnötig in die Breite, und nicht etwa den Inhalt der Re´s meinte, der mir sicherlich gut weiterhilft.

Die LCase-Funktion hatte ich noch nicht eingebaut, weil ja das Script auf meinem Rechner sowiso noch nicht läuft und hätte mit natürlich geläufig sein müssen, aber ist doch ziemlich viel neues für mich.

Const adFldIsNullable = 32

Set DataList = CreateObject("ADOR.Recordset") 'Datenbankobjekt erstellen  
DataList.Fields.Append "URL", adVarChar, MaxCharacters, adFldIsNullable  'Feld "URL" definieren  
DataList.Fields.Append "Text", adVarChar, MaxCharacters, adFldIsNullable 'Feld "Text" definieren  
DataList.Open
If LCase(DataList.Fields.Item("URL")) <> LCase(sPrevURL) Or _  
	   LCase(DataList.Fields.Item("Text")) <> LCase(sPrevText Then)  

Set oUnsortiert = fso.OpenTextFile(sUnsortiert, ForReading) 'Unsortierte Datei zum Lesen öffnen  

Ist die Funktion hier richtig eingesetzt?

Grüße
Fränky
Member: bastla
bastla Aug 27, 2007 at 13:21:58 (UTC)
Goto Top
Hallo Fraenky!

Ist die Funktion hier richtig eingesetzt?
Nein - sie gehört in den letzten Teil (Zeile 67 des unten geposteten Scripts), wo nach dem Sortieren die Entscheidung zu treffen ist, ob der Datensatz in die "Sortiert.txt" geschrieben werden soll oder nicht.

Magst du uns beiden den Gefallen tun, für Deine weiteren Tests folgenden Stand des Scripts zu verwenden?
sUnsortiert = "C:\skript\Liste_sort\liste.txt"    'Quelldatei  
sSortiert = "C:\skript\Liste_sort\Sortiert.txt"   'Zieldatei  
sProtokoll = "C:\skript\Liste_sort\Protokoll.txt" 'Protokoll für nicht verarbeitete Sätze  

Const ForReading = 1, ForWriting = 2, ForAppending = 8 'Öffnungsarten für Textdateien  
Set fso = CreateObject("Scripting.FileSystemObject") 'für Dateisystemzugriffe  

'für die Definition der Datenfelder (siehe verlinkter Artikel)  
Const adVarChar = 200
Const MaxCharacters = 255
Const adFldIsNullable = 32

Set DataList = CreateObject("ADOR.Recordset") 'Datenbankobjekt erstellen  
DataList.Fields.Append "URL", adVarChar, MaxCharacters, adFldIsNullable  'Feld "URL" definieren  
DataList.Fields.Append "Text", adVarChar, MaxCharacters, adFldIsNullable 'Feld "Text" definieren  
DataList.Open

Set oUnsortiert = fso.OpenTextFile(sUnsortiert, ForReading) 'Unsortierte Datei zum Lesen öffnen  
Set oProtokoll = fso.OpenTextFile(sProtokoll, ForWriting, True) 'Protokolldatei zum Schreiben öffnen; altes Protokoll überschreiben  
Do While Not oUnSortiert.AtEndOfStream 'Schleife bis zum Dateiende  
	aZeile = Split(oUnsortiert.ReadLine, """") 'Zeile einlesen und an den Anführungszeichen zerteilen  
	If UBound(aZeile) = 2 Then '2 Anführungszeichen gefunden - 3 Teile:  
		'1. Teil = aZeile(0): alles vor URL (vor dem ersten Anführungszeichen)  
		'2. Teil = aZeile(1): URL (gefunden zwischen Anführungszeichen)  
		'3. Teil = aZeile(2): alles nach URL (nach dem zweiten Anführungszeichen)  

		'Zerlegung des 3. Teiles:  
		sText = Left(aZeile(2), InStr(aZeile(2), "<") - 1) 'bis zum ersten "<"  
		sText = Mid(sText, InStrRev(sText, ">") + 1) 'ab dem letzten ">"  
		If aZeile(1) <> "" Or sText <> "" Then  
			DataList.AddNew 'neuen Datensatz erstellen  
			DataList("URL") = aZeile(1) 'Feld "URL" befüllen  
			DataList("Text") = sText    'Feld "Text" befüllen   
			DataList.Update '...  und Datensatz eintragen  
		Else
			'Eintrag in das Protokoll:  
				'Alle Teile zusammenfassen,  
				'dabei die entfernten Anführungszeichen wieder einfügen und  
				'Zeile in Protokolldatei schreiben  
			oProtokoll.WriteLine Join(aZeile, """")  
		End If
	Else
		'anderer Zeilenaufbau - wäre näher zu untersuchen  
		'zumindest Protokolleintrag erstellen  
		oProtokoll.WriteLine Join(aZeile, """")  
	End If
Loop
oUnsortiert.Close 'Eingabedatei schließen  
oProtokoll.Close 'Protokolldatei schließen  
'Sortierkriterium feststellen - Billigvariante ;-)  
R = MsgBox("Sortierung nach Name (Ja) oder nach URL (Nein)?", vbYesNo)  
If R = vbYes Then
	DataList.Sort = "Text"  
Else
	DataList.Sort = "URL"	  
End If

'Zieldatei öffnen; ev bereits vorhandene Datei überschreiben  
Set oSortiert = fso.OpenTextFile(sSortiert, ForWriting, True)
'Startwerte für Satzvergleich setzen  
sPrevURL = ""   
sPrevText = ""  
lCounter = 0 'Zähler für geschriebene Sätze  
DataList.MoveFirst 'beim ersten Datensatz beginnen ...  
Do Until DataList.EOF '... und bis zum letzten durchgehen  
	'Unterschied zum vorhergehenden Datensatz?  
	If LCase(DataList.Fields.Item("URL")) <> LCase(sPrevURL) Or _  
	   LCase(DataList.Fields.Item("Text")) <> LCase(sPrevText) Then  
		'keine Übereinstimmung beider Felder mit vorigem Datensatz, daher  
		'Ausgabezeile zusammensetzen und schreiben  
		oSortiert.WriteLine "<p><a href=""" & _  
			DataList.Fields.Item("URL") & _  
			""">" & _  
			DataList.Fields.Item("Text") & _  
			"</a></p>"  
		lCounter = lCounter + 1 'Zähler erhöhen  
		'letzte geschriebene Daten merken  
		sPrevURL = DataList.Fields.Item("URL")  
		sPrevText = DataList.Fields.Item("Text")  
	End If
	'nächsten Datensatz auswählen  
	DataList.MoveNext
Loop
'Ausgabedatei schließen  
oSortiert.Close
'Anzahl Datensätze ausgeben  
MsgBox "Anzahl der Datensätze im Ergebnis: " & CStr(lCounter) & vbCrLF & vbCrLF  & _  
	"Anzahl der entfernten Duplikate: " & CStr(DataList.RecordCount - lCounter)  
Eine Kleinigkeit habe ich am Ende noch hinzugefügt: Es wird jetzt auch die Differenz zwischen den in der Datenbank enthaltenen (nicht den eingelesenen!) und den tatsächlich ausgegebenen Datensätzen ermittelt und angezeigt. Da die "Nicht-Ausgabe" nur aufgrund der Duplikatsprüfung erfolgt sein kann, entspricht diese Differenz der Anzahl der ausgeschiedenen doppelt (oder mehrfach) vorkommenden Links.

Grüße
bastla
Member: Fraenky
Fraenky Aug 27, 2007 at 13:24:04 (UTC)
Goto Top
Hallo Bastla.

Der Befehl RecordCount ist ja im Script nicht definiert, greift also auf Standartfunktionen der Datenbank zu.
Woher weiß mein Comuter das denn, wo ich doch nichts, also weder VBS noch Datenbanken installiert habe?

Gruß
Fränky
Member: bastla
bastla Aug 27, 2007 at 13:35:36 (UTC)
Goto Top
Hallo Fraenky!

Da mit
Set DataList = CreateObject("ADOR.Recordset") 'Datenbankobjekt erstellen  
ein Datenbankobjekt im Speicher eingerichtet, Felder definiert und Datensätze eingetragen wurden, ist es auch möglich, die Anzahl der in der Datenbank enthaltenen Datensätze auszulesen.

Woher weiß mein Comuter das denn, wo ich doch nichts, also weder VBS noch Datenbanken installiert habe?
Die Frage kommt (hinsichtlich VBS) ziemlich spät. face-wink

Es handelt sich hier um Windows-Standardkomponenten, die grundsätzlich bereits mit Windows installiert worden sein sollten (ADOR etwa als "Microsoft ActiveX Data Objects Recordset 2.0 Library" ist in der MSADOR15.DLL enthalten - und nein, ich weiß nicht, warum in einer Datei namens "MSADOR15.DLL" eine Version 2.0 steckt).

Grüße
bastla
Member: Fraenky
Fraenky Aug 27, 2007 at 15:56:42 (UTC)
Goto Top
Hallo Bastla.
Ich habe einmal meine Testdat etwas abgeändert.

<p><a href="Pfad/556">1</a></p>  
<p><a href="Pfad/884</a></p>  
<p><a href="Pfad/421">3</a></p>  
<p><a href="Pfad/478">56</a></p>  
<p><a href="Pfad/887">1</a></p>  
<p><a href="Pfad/712">56</a></p>  
<p><a href="Pfad/712">78</a></p>  
<p><a href="Pfad/887">24</a></p>  
<p><a href="Pfad/58">54</a></p>  
<p><a href="Pfad/562">89</a></p>  
<p><a href="Pfad/57">53</a></p>  
<p><a href="Pfad/9">4</a></p>  

Ergebnis nach Name:

<p><a href="../../../Pfad/556">1</a></p>  
<p><a href="../../../Pfad/887">1</a></p>  
<p><a href="../../../Pfad/887">24</a></p>  
<p><a href="../../../Pfad/421">3</a></p>  
<p><a href="../../../Pfad/9">4</a></p>  
<p><a href="../../../Pfad/57">53</a></p>  
<p><a href="../../../Pfad/58">54</a></p>  
<p><a href="../../../Pfad/478">56</a></p>  
<p><a href="../../../Pfad/712">56</a></p>  
<p><a href="../../../Pfad/712">78</a></p>  
<p><a href="../../../Pfad/562">89</a></p>  

Ergebnis nach URL:

<p><a href="../../../Pfad/421">3</a></p>  
<p><a href="../../../Pfad/478">56</a></p>  
<p><a href="../../../Pfad/556">1</a></p>  
<p><a href="../../../Pfad/562">89</a></p>  
<p><a href="../../../Pfad/57">53</a></p>  
<p><a href="../../../Pfad/58">54</a></p>  
<p><a href="../../../Pfad/712">56</a></p>  
<p><a href="../../../Pfad/712">78</a></p>  
<p><a href="../../../Pfad/887">1</a></p>  
<p><a href="../../../Pfad/887">24</a></p>  
<p><a href="../../../Pfad/9">4</a></p>  


Auffällt, das Dopplungen vorhanden sind und das eigenwillige Ordnungsprinzip.
Mein ISP hat gerade anscheinend ein paar Schwierigkeiten, seinen Service aufrecht zu halten.
Könnte also zu zeitlichen Verzögerungen kommen.

Und Fragen stellen sich mir dann, wenn sie mir bewußt werden.

Gruß
Fränky
Member: bastla
bastla Aug 27, 2007 at 16:27:55 (UTC)
Goto Top
Hallo Fraenky!

Auffällt, das Dopplungen vorhanden sind ...
Es wäre dann an der Zeit, mir Deine Definition von "Dopplungen" mitzuteilen - für mich gibt es in den Ergebnislisten kein einziges Beispiel, in welchem URL und Link-Text mit einer anderen Zeile übereinstimmen und sich dadurch aufeinanderfolgende Zeilen nicht unterschieden - daher keine Duplikate.

... und das eigenwillige Ordnungsprinzip.
Vorweg: Es erfolgt eine Sortierung von Texten, nicht von Zahlen.

Das Ordnungsprinzip ist sehr einfach und klar: Vergleiche die erste Stelle, bei Gleichheit vergleiche die zweite Stelle, bei Gleichheit ... daher wird "24" vor "3" eingeordnet und "562" landet vor "57". Vergleichskriterium ist der Code des Zeichens lt verwendeter Codierung (hier also ANSI).

Sind die Texte nicht gleich lang, aber bis zur letzten Stelle des kürzeren Textes identisch, wird der kürzere Text zuerst eingeordnet.

Um "57" vor "562" eingeordnet zu bekommen, müssten beide Texte auf eine gleiche Länge gebracht werden indem von links aufgefüllt wird (die Methode wird "padding" genannt, Ergebnis etwa "057" oder " 57") oder es müsste explizit eine Sortierung nach Zahlen erfolgen - dazu müsste allerdings der Datenbestand in "numerisch" und "alphanumerisch" aufgespalten werden.

Grüße
bastla
Member: Fraenky
Fraenky Aug 27, 2007 at 17:09:01 (UTC)
Goto Top
Hallo Bastla.

Die Zahlen habe ich nur eingesetzt, um das Problem sichtbarer zu machen. Buchstaben werden ja richtig geordnet und darauf kommt es an. Nur dabei viel mir eben das Ordnungsprinzip auf.
Ja natürlich hast du recht. Auch Testdateien wollen ordentlich erstellt sein.
Aber ich kann jetzt den schon mal erwähnten Fehler rekonstruieren:

Skript  .vbs
Zeile 28
Zeichen 3
Fehler Ungültiger Prozeduraufruf oder ungültiges Argument : Left
Code 800A0005
Quelle Laufzeitfehler in MS VBS
Als ich die Zahlen durchlaufen ließ, alles wunderbar.
Als ich den Zahlen noch ein paar andere Originallinks anfügte, alles wunderbar
Als ich die Originalliste mit über 3000 Einträgen einsetzte, erschien die oben angezeigte Fehlermeldung.

Das läßt mich vermuten, das irgendwo ein Überlauf produziert wird.

Gruß
Fränky
Member: Fraenky
Fraenky Aug 27, 2007 at 18:27:30 (UTC)
Goto Top
Hallo Bastla.
Ich habe jetzt die Liste mit den Zahlen auf über 3600 dupliziert und es lief einwandfrei,
Kann ich dir mal die OriginallinkListe, die, die Schwierigkeiten macht, zumailen?
Gruß
Fränky
Member: bastla
bastla Aug 27, 2007 at 22:30:09 (UTC)
Goto Top
Hallo Fraenky!

Die Analyse der Gesamtliste zeigt, dass, bis auf einige Kleinigkeiten, das Hauptproblem in Zeilenumbrüchen innerhalb der Link-Texte besteht.

Mit dem folgenden Script können die meisten dieser Umbrüche rückgängig gemacht werden:
sUnkorrigiert = "C:\skript\Liste_sort\Original.txt" 'Quelldatei = Originalliste  
sKorrigiert = "C:\skript\Liste_sort\liste.txt"      'Zieldatei = Quelldatei für Sortierung  
sProtokollKorrektur = "C:\skript\Liste_sort\ProtokollKorrektur.txt"   'Protokoll für fehlerhafte Sätze  

Const ForReading = 1, ForWriting = 2, ForAppending = 8 'Öffnungsarten für Textdateien  
Set fso = CreateObject("Scripting.FileSystemObject") 'für Dateisystemzugriffe  

Set oUnkorrigiert = fso.OpenTextFile(sUnkorrigiert, ForReading)
Set oKorrigiert = fso.OpenTextFile(sKorrigiert, ForWriting, True)
Set oProtokollKorrektur = fso.OpenTextFile(sProtokollKorrektur, ForWriting, True)
lInCounter = 0
Do While Not oUnKorrigiert.AtEndOfStream 'Schleife bis zum Dateiende  
	sZeile = oUnKorrigiert.ReadLine 'Zeile einlesen  
	lInCounter = lIncounter + 1
	If Trim(sZeile) = "" Then 'Leerzeile  
		oProtokollKorrektur.WriteLine Right("    " & CStr(lInCounter), 4) & "  Leerzeile!" 'im Protokoll festhalten  
	Else
		If Right(RTrim(sZeile), 1) <> ">" Then 'Zeile endet nicht mit ">", vermutlich umgebrochen  
			oProtokollKorrektur.WriteLine Right("    " & CStr(lInCounter), 4) & " ## " & sZeile 'im Protokoll festhalten  
			sNZeile = oUnKorrigiert.ReadLine 'Nächste Zeile einlesen  
			lInCounter = lIncounter + 1
			If Left(LTrim(sNZeile), 1) <> "<" Then 'Zeile beginnt nicht mit "<", vermutlich Fortsetzung  
				sZeile = RTrim(sZeile) & " " & LTrim(sNZeile) 'Zeilen verbinden; zwischen beiden Teilen nur eine Leerstelle zulassen  
			Else ''Zeile beginnt mit "<", normal behandeln  
				sZeile = sNZeile
			End If
		End If
		aZeile = Split(sZeile, """")  
		If UBound(aZeile) = 2 Then '2 Anführungszeichen gefunden - 3 Teile:  
			If InStr(aZeile(2), "<") < 2 Then 'fehlerhafter Link-Text, im Protokoll festhalten, aber nicht bearbeiten  
				oProtokollKorrektur.WriteLine Right("    " & CStr(lInCounter), 4) & " -- " & sZeile  
			Else 'sollte OK sein  
				sText = Left(aZeile(2), InStr(aZeile(2), "<") - 1) 'bis zum ersten "<"  
				sText = Mid(sText, InStrRev(sText, ">") + 1) 'ab dem letzten ">"  
				If aZeile(1) <> "" Or sText <> "" Then 'nicht leer, daher ...  
					oKorrigiert.WriteLine sZeile '... Zeile behalten  
				Else 'URL und Link-Text leer  
					'Eintrag in das Protokoll:  
					oProtokoll.WriteLine Right("    " & CStr(lInCounter), 4) & " __ " & Join(aZeile, """")  
				End If
			End If
		Else
		'falscher Zeilenaufbau - ausscheiden und  
		'Protokolleintrag erstellen  
		oProtokollKorrektur.WriteLine Right("    " & CStr(lInCounter), 4) & " ][ " & sZeile  
		End If
	End If
Loop
oKorrigiert.Close
oUnKorrigiert.Close
oProtokollKorrektur.Close
'Anzahl Datensätze ausgeben  
MsgBox CStr(lInCounter) & " Datensätze eingelesen.", vbOK, "Statistik"  
Ändere zunächst den Namen der bisherigen unsortierten Datei "liste.txt" auf "Original.txt" und führe das Script aus.

Als Ergebnis entstehen eine neue "liste.txt" und eine "ProtokollKorrekturen.txt", welche als Grundlage für manuelle Korrekturen der (wenigen) verbleibenden Fehler dienen kann. Dieses Protokoll enthält Zeilen wie:
 124 ## <p><a href="../../../Pfad/Ain_Soph.php">Ain   
Der in Zeile 124 gefundene Fehler (kein "<" nach dem Link-Text - Kennzeichen "##") wurde durch Zusammenfassung mit Zeile 125 (vermutlich) korrigiert - eine Änderung in der "liste.txt" sollte nicht mehr erforderlich sein - zur Sicherheit vielleicht aber trotzdem solche Zeilen überprüfen!
 159 ][ <p><br>
Der Aufbau der Zeile 159 entspricht nicht der Vorschrift "genau 2 Anführungszeichen" (Kennzeichen "]["), die Zeile wurde aber auch nicht als Fortsetzung der vorhergehenden Zeile verwendet und daher ausgeschieden, wird aber ohnehin nicht benötigt, da kein Informationsgehalt - einfach ignorieren!
1405 ][   Estrada do Amor</a><br>
Auch für den Fehler in Zeile 1405 gilt die gleiche Erklärung wie oben bei 159, allerdings könnte dies die Fortsetzung von Zeile 1404 sein - mit Editor überprüfen und ggf von Hand korrigieren!
1840 ][   <a href="../../../Pfad/Irm%E3os.php">Ir</a><a href="../../../Pfad/Irm%E3os.php">m&atilde;os</a></p>  
Auch hier ist der Aufbau nicht in Ordnung - der Fehler resultiert ev aus einer fehlenden Zeilenschaltung zwischen den beiden Links - ebenfalls per Handarbeit im Editor richtig stellen.
Der folgende Protokolleintrag sollte selbsterklärend sein face-wink:
1156  Leerzeile!
Alle angesprochenen manuellen Bearbeitungsschritte sind in der "liste.txt" vorzunehmen, damit diese dann als Ausgangsdatei für die folgende (wie ich hoffe, letzte) Fassung des Sortierscripts verwendet werden kann:
sUnsortiert = "C:\skript\Liste_sort\liste.txt"    'Quelldatei  
sSortiert = "C:\skript\Liste_sort\Sortiert.txt"   'Zieldatei  
sProtokoll = "C:\skript\Liste_sort\Protokoll.txt" 'Protokoll für nicht verarbeitete Sätze  

Const ForReading = 1, ForWriting = 2, ForAppending = 8 'Öffnungsarten für Textdateien  
Set fso = CreateObject("Scripting.FileSystemObject") 'für Dateisystemzugriffe  

'für die Definition der Datenfelder (siehe verlinkter Artikel)  
Const adVarChar = 200
Const MaxCharacters = 255
Const adFldIsNullable = 32

Set DataList = CreateObject("ADOR.Recordset") 'Datenbankobjekt erstellen  
DataList.Fields.Append "URL", adVarChar, MaxCharacters, adFldIsNullable  'Feld "URL" definieren  
DataList.Fields.Append "Text", adVarChar, MaxCharacters, adFldIsNullable 'Feld "Text" definieren  
DataList.Open

Set oUnsortiert = fso.OpenTextFile(sUnsortiert, ForReading) 'Unsortierte Datei zum Lesen öffnen  
Set oProtokoll = fso.OpenTextFile(sProtokoll, ForWriting, True) 'Protokolldatei zum Schreiben öffnen; altes Protokoll überschreiben  
lInCounter = 0
Do While Not oUnSortiert.AtEndOfStream 'Schleife bis zum Dateiende  
	aZeile = Split(oUnsortiert.ReadLine, """") 'Zeile einlesen und an den Anführungszeichen zerteilen  
	lInCounter = lIncounter + 1
	If UBound(aZeile) = 2 Then '2 Anführungszeichen gefunden - 3 Teile:  
		'1. Teil = aZeile(0): alles vor URL (vor dem ersten Anführungszeichen)  
		'2. Teil = aZeile(1): URL (gefunden zwischen Anführungszeichen)  
		'3. Teil = aZeile(2): alles nach URL (nach dem zweiten Anführungszeichen)  

		'Zerlegung des 3. Teiles:  
		If InStr(aZeile(2), "<") < 2 Then 'fehlerhafter Link-Text  
			oProtokoll.WriteLine Right("    " & CStr(lInCounter), 4) & " -- " & Join(aZeile, """")  
		Else
			sText = Left(aZeile(2), InStr(aZeile(2), "<") - 1) 'bis zum ersten "<"  
			sText = Mid(sText, InStrRev(sText, ">") + 1) 'ab dem letzten ">"  
			If aZeile(1) <> "" Or sText <> "" Then  
				DataList.AddNew 'neuen Datensatz erstellen  
				DataList("URL") = aZeile(1) 'Feld "URL" befüllen  
				DataList("Text") = sText    'Feld "Text" befüllen   
				DataList.Update '...  und Datensatz eintragen   
			Else
				'Eintrag in das Protokoll:  
					'Alle Teile zusammenfassen,  
					'dabei die entfernten Anführungszeichen wieder einfügen und  
					'Zeile in Protokolldatei schreiben  
				oProtokoll.WriteLine Right("    " & CStr(lInCounter), 4) & " __ " & Join(aZeile, """")  
			End If
		End If
	Else
		'anderer Zeilenaufbau - wäre näher zu untersuchen  
		'zumindest Protokolleintrag erstellen  
		oProtokoll.WriteLine Right("    " & CStr(lInCounter), 4) & " ][ " & Join(aZeile, """")  
	End If
Loop
oUnsortiert.Close 'Eingabedatei schließen  
oProtokoll.Close 'Protokolldatei schließen  

'Sortierkriterium feststellen - Billigvariante ;-)  
R = MsgBox("Sortierung nach Name (Ja) oder nach URL (Nein)?", vbYesNo)  
If R = vbYes Then
	DataList.Sort = "Text"  
Else
	DataList.Sort = "URL"	  
End If

'Zieldatei öffnen; ev bereits vorhandene Datei überschreiben  
Set oSortiert = fso.OpenTextFile(sSortiert, ForWriting, True)
'Startwerte für Satzvergleich setzen  
sPrevURL = ""   
sPrevText = ""  
lCounter = 0 'Zähler für geschriebene Sätze  
DataList.MoveFirst 'beim ersten Datensatz beginnen ...  
Do Until DataList.EOF '... und bis zum letzten durchgehen  
	'Unterschied zum vorhergehenden Datensatz?  
	If LCase(DataList.Fields.Item("URL")) <> LCase(sPrevURL) Or _  
	   LCase(DataList.Fields.Item("Text")) <> LCase(sPrevText) Then  
		'keine Übereinstimmung beider Felder mit vorigem Datensatz, daher  
		'Ausgabezeile zusammensetzen und schreiben  
		oSortiert.WriteLine "<p><a href=""" & _  
			DataList.Fields.Item("URL") & _  
			""">" & _  
			DataList.Fields.Item("Text") & _  
			"</a></p>"  
		lCounter = lCounter + 1 'Zähler erhöhen  
		'letzte geschriebene Daten merken  
		sPrevURL = DataList.Fields.Item("URL")  
		sPrevText = DataList.Fields.Item("Text")  
	End If
	'nächsten Datensatz auswählen  
	DataList.MoveNext
Loop
'Ausgabedatei schließen  
oSortiert.Close
'Anzahl Datensätze ausgeben  
MsgBox Right("____" & CStr(lInCounter), 4) & "__ Datensätze eingelesen " & vbCrLF & _  
	   Right("____" & CStr(lInCounter - DataList.RecordCount), 4) & "__ fehlerhafte Zeilen entfernt " & vbCrLF & vbCrLF & _  
	   Right("____" & CStr(lCounter), 4) & "__ Datensätze im Ergebnis " & vbCrLF & _  
	   Right("____" & CStr(DataList.RecordCount - lCounter), 4) & "__ Duplikatzeilen entfernt ", _  
	   vbOK, "Statistik"  
In dieser Version wird der Fehler "Ungültiger Prozeduraufruf oder ungültiges Argument Left" der ehemaligen Zeile 28 (jetzt 33) abgefangen und Protokoll und abschließend ausgegebene Statistik sind noch etwas detaillierter.

Grüße
bastla
Member: Fraenky
Fraenky Aug 28, 2007 at 08:20:42 (UTC)
Goto Top
Hallo Bastla.
Ja, ja, mein ISP.
Hatte dadurch aber die Gelegenheit, einen sehr interesannten Artikel über VBS offline zu lesen
Super Bastla, werde die Skripte jetzt mal testen.
Wie hätte den das Schema einer Testdatei aussehen müssen, um diese Fehler darin schon erkennen zu können, damit ich weiß, worauf ich beim nächsten Erstellen einer Testdatei zu achten habe.

Viele Grüße
Fränky
Member: bastla
bastla Aug 28, 2007 at 10:54:27 (UTC)
Goto Top
Hallo Fraenky!

Eine Testdatei sollte die typischen Datensätze enthalten - dazu musst Du die Struktur Deiner Ausgangsdaten möglichst genau analysieren, um auch möglichst viele "Auffälligkeiten" zu finden und bei den Tests berücksichtigen zu können.

Im übrigen solltest Du die richtigen Werkzeuge einsetzen - nicht zuletzt auch beim Posten hier im Forum. Insbesondere für Daten, in denen ja einzelne Zeichen (oder etwa ein Zeilenumbruch) die Verwendbarkeit beeinflussen können, solltest Du die < code>-Tags verwenden - dann muss man/frau nicht raten, ob eine bestimmte Darstellung original oder durch die Forumssoftware bedingt ist.

Grüße
bastla
Member: Fraenky
Fraenky Aug 28, 2007 at 12:26:58 (UTC)
Goto Top
Hallo Bastla.
Das Problem mit den getrennten Zeilen hatte ich ja schon in meinem Posting vom 23.08.2007 um 22:34:57 angesprochen und eine Lösung vorgeschlagen.
Deine Lösung hier ist natürlich viel eleganter:
If Right(RTrim(sZeile), 1) <> ">" Then 'Zeile endet nicht mit ">", vermutlich umgebrochen  
			oProtokollKorrektur.WriteLine Right("    " & CStr(lInCounter), 4) & " ## " & sZeile 'im Protokoll festhalten  
			sNZeile = oUnKorrigiert.ReadLine 'Nächste Zeile einlesen  
			lInCounter = lIncounter + 1
			If Left(LTrim(sNZeile), 1) <> "<" Then 'Zeile beginnt nicht mit "<", vermutlich Fortsetzung  
				sZeile = RTrim(sZeile) & " " & LTrim(sNZeile) 'Zeilen verbinden; zwischen beiden Teilen nur eine Leerstelle zulassen  
			Else ''Zeile beginnt mit "<", normal behandeln  

Weiter gibt es in der Linkliste noch Zeilen, die kein <p> vorranstehen haben und Zeilen, die am Ende ein <br> haben.
dachte, das hätten Wir beim zusammenbauen der Satzteile schon erledigt.

oProtokollKorrektur Das o steht in dem Variablennamen bei Dir für Objekt, richtig?

Die Meldung von über 500 Duplikaten irritiert mich etwas.
Die möchte ich einsehen können und noch mal überprüfen.
Kann mir nicht vorstellen, das ich bei ca 3500 Gesammtzeilen 1/7
Duplikate erzeugt habe.
Obwohl bei Durchsicht in meinem html editor 3670 zu 3454 Zeilen beträgt, was sich durchaus mit den unterbrochenen Zeilen und den Leerzeilen, Zeilen mit <p></P> usw erklären ließe.

Vieleicht verstehst Du jetzt etwas besser, warum ich soviele Fragen stellen mußte, weil ja das Skript bei mir nicht lief und Du in einem Posting etwas von extra für mich ( zu Übungszwecken) eingebauten Fehlern gesagt hattest, was ich also immer im Hinterkopf hatte und in Betracht ziehen mußte.
Darum habe ich den Code stellenweise verändert, um den Fehler "Links" ausfindig zu machen, was dann wiederum zu Fragen führte.

Ich schlage vor, das Du mir zum Abschluß 3 Fragen über "Liste sortieren7" stellst, vieleicht mit aufsteigendem Schwierigkeitsgrad, um festzustellen, ob Deine Bedingung erfüllt ist.
If
Im Übrigen bist Du nach eigenem Bekunden an ganz kleinen Schritten interessiert - bevor Du also am Abgleichen von Links mit Ordnern oder Ähnlichem zu arbeiten beginnst (ich werde das nämlich vorläufig nicht tun), versuche einmal das vorliegende Script zu verstehen und gegebenen Falles anzupassen. (vom 25.08.2007 um 12:46:13)
Then
Neue Aufgabe "Linkliste verifizieren und ggf. korrigieren"
Else
Nachschulung

Grüße
Fränky
Member: bastla
bastla Aug 28, 2007 at 13:38:53 (UTC)
Goto Top
Hallo Fraenky!

Das Problem mit den getrennten Zeilen hatte ich ja schon in meinem Posting vom 23.08.2007 um 22:34:57 angesprochen und eine Lösung vorgeschlagen.
Leider hatte ich "Trennung" als "Linktext mit enthaltenen Leerzeichen" interpretiert und (auch aufgrund der Formatierung im Forum) war nicht davon ausgegangen, dass in der Ausgangsdatei tatsächlich ein Zeilenumbruch vorhanden ist ...

Weiter gibt es in der Linkliste noch Zeilen, die kein <p> vorranstehen haben und Zeilen, die am Ende ein <br> haben.
dachte, das hätten Wir beim zusammenbauen der Satzteile schon erledigt.
Diese Teile sind schlichtweg entbehrlich, da beim endgültigen Ausgeben der Links ohnehin nur die Werte aus der Datenbank (URL und Link-Text) verwendet und mit den nötigen Tags ergänzt werden.

Das o steht in dem Variablennamen bei Dir für Objekt, richtig?
Ja. Die Benennung von Variablen ist dem Programmierer überlassen, daher wirst Du sehr oft auch "obj" bzw gar kein Präfix vorfinden.

Die möchte ich einsehen können und noch mal überprüfen.
Zu diesem Zweck könnten sie in eine eigene Protokolldatei geschrieben werden, etwa so: Vor
'Zieldatei öffnen; ev bereits vorhandene Datei überschreiben  
Set oSortiert = fso.OpenTextFile(sSortiert, ForWriting, True)
könntest Du noch ein
Set oProtokollDuplikate = fso.OpenTextFile(sProtokollDuplikate, ForWriting, True)
setzen, was natürlich bedingt, dass am Anfang des Scripts eine Zeile für den Pfad hinzukommt:
sProtokollDuplikate = "C:\skript\Liste_sort\ProtokollDuplikate.txt"   'Protokoll für doppelte Sätze  
Analog zum Öffnen ist dann auch ein
oProtokollDuplikate.Close
unmittelbar vor oder nach (die Reihenfolge ist hier egal) dem Schließen von "oSortiert" zu integrieren.
Die entscheidende Zeile (es ist für Basic nur eine Zeile)
				oProtokollDuplikate.WriteLine "zu " & Right("    " & CStr(lCounter), 4) & ": " & _  
						"<p><a href=""" & _  
						DataList.Fields.Item("URL") & _  
						""">" & _  
						DataList.Fields.Item("Text") & _  
						"</a></p>"  
ist schließlich in einem neu zu schaffenden "Else"-Zweig des in der Ausgabe-Schleife verwendeten "If" - "Then" - "End If" zu platzieren.

Die zusätzliche Ausgabe der Zeilennummer ermöglicht dann den direkten Vergleich mit den Zeilen der "Sortiert.txt".

Grüße
bastla
Member: Fraenky
Fraenky Aug 28, 2007 at 15:36:01 (UTC)
Goto Top
Hallo Bastla.
Danke für Deine Aufgabenstellung, die genau auf meinen jetzigen Kenntnisstand ausgerichtet war.
Das Skript lief einwandfrei durch und erfüllte alle Ansprüche, so das ich davon ausgehe, das es richtig modifiziert wurde.
Wenn ich jetzt weiterhin davon ausgehe, das auch der erste Teil Deiner Bedingung von Dir als erfüllt anerkannt wird, können Wir jetzt diesen Bandwurm beenden und das neue Projekt beginnen.
Zu VBS möchte ich noch sagen, das das ja genau die richtige Scriptsprache für Windows Nutzer ist. Mit VBS wird der Computer endlich zu meinem Arbeiter und nicht ich zum Teil des Computers. In der Zwischenzeit hatte ich mich mit dem Programm RemoteKeys über Wasser gehalten, das Aufgaben wenigstens Teilautomatisierte.
Mit VBS habe ich jetzt die Möglichkeit, nicht nur auf verdeckte MS Funktionen zuzugreifen, sondern auch auf Programmmodule installierter Programme, z.B. Rechtschreibprüfung von Word usw.
Das ist ja suuuuppppeeeeerrrrrrr. face-smile
Hier noch ein gestern gefundener Link für alle Leser, die es bis hierhin durchgehalten haben:

http://www.microsoft.com/germany/technet/datenbank/articles/600358.mspx ...

Von MS eine deutsche Einführung in VBS mit nach und nach erweiterten Codebeispielen, sehr gut erläutert. Echt lesenswert, zumindest für Anfänger.

Und hier der wohl letzte Stand der Dinge:

sUnsortiert = "C:\skript2\Liste_sort\liste.txt"    'Quelldatei  
sSortiert = "C:\skript2\Liste_sort\Sortiert.txt"   'Zieldatei  
sProtokoll = "C:\skript2\Liste_sort\Protokoll.txt" 'Protokoll für nicht verarbeitete Sätze  
sProtokollDuplikate = "C:\skript2\Liste_sort\ProtokollDuplikate.txt"   'Protokoll für doppelte Sätze  

Const ForReading = 1, ForWriting = 2, ForAppending = 8 'Öffnungsarten für Textdateien  
Set fso = CreateObject("Scripting.FileSystemObject") 'für Dateisystemzugriffe  

'für die Definition der Datenfelder (siehe verlinkter Artikel)  
Const adVarChar = 200
Const MaxCharacters = 255
Const adFldIsNullable = 32

Set DataList = CreateObject("ADOR.Recordset") 'Datenbankobjekt erstellen  
DataList.Fields.Append "URL", adVarChar, MaxCharacters, adFldIsNullable  'Feld "URL" definieren  
DataList.Fields.Append "Text", adVarChar, MaxCharacters, adFldIsNullable 'Feld "Text" definieren  
DataList.Open

Set oUnsortiert = fso.OpenTextFile(sUnsortiert, ForReading) 'Unsortierte Datei zum Lesen öffnen  
Set oProtokoll = fso.OpenTextFile(sProtokoll, ForWriting, True) 'Protokolldatei zum Schreiben öffnen; altes Protokoll überschreiben  
lInCounter = 0
Do While Not oUnSortiert.AtEndOfStream 'Schleife bis zum Dateiende  
	aZeile = Split(oUnsortiert.ReadLine, """") 'Zeile einlesen und an den Anführungszeichen zerteilen  
	lInCounter = lIncounter + 1
	If UBound(aZeile) = 2 Then '2 Anführungszeichen gefunden - 3 Teile:  
		'1. Teil = aZeile(0): alles vor URL (vor dem ersten Anführungszeichen)  
		'2. Teil = aZeile(1): URL (gefunden zwischen Anführungszeichen)  
		'3. Teil = aZeile(2): alles nach URL (nach dem zweiten Anführungszeichen)  

		'Zerlegung des 3. Teiles:  
		If InStr(aZeile(2), "<") < 2 Then 'fehlerhafter Link-Text  
			oProtokoll.WriteLine Right("    " & CStr(lInCounter), 4) & " -- " & Join(aZeile, """")  
		Else
			sText = Left(aZeile(2), InStr(aZeile(2), "<") - 1) 'bis zum ersten "<"  
			sText = Mid(sText, InStrRev(sText, ">") + 1) 'ab dem letzten ">"  
			If aZeile(1) <> "" Or sText <> "" Then  
				DataList.AddNew 'neuen Datensatz erstellen  
				DataList("URL") = aZeile(1) 'Feld "URL" befüllen  
				DataList("Text") = sText    'Feld "Text" befüllen   
				DataList.Update '...  und Datensatz eintragen   
			Else
				'Eintrag in das Protokoll:  
					'Alle Teile zusammenfassen,  
					'dabei die entfernten Anführungszeichen wieder einfügen und  
					'Zeile in Protokolldatei schreiben  
				oProtokoll.WriteLine Right("    " & CStr(lInCounter), 4) & " __ " & Join(aZeile, """")  
			End If
		End If
	Else
		'anderer Zeilenaufbau - wäre näher zu untersuchen  
		'zumindest Protokolleintrag erstellen  
		oProtokoll.WriteLine Right("    " & CStr(lInCounter), 4) & " ][ " & Join(aZeile, """")  
	End If
Loop
oUnsortiert.Close 'Eingabedatei schließen  
oProtokoll.Close 'Protokolldatei schließen  

'Sortierkriterium feststellen - Billigvariante ;-)  
R = MsgBox("Sortierung nach Name (Ja) oder nach URL (Nein)?", vbYesNo)  
If R = vbYes Then
	DataList.Sort = "Text"  
Else
	DataList.Sort = "URL"	  
End If

Set oProtokollDuplikate = fso.OpenTextFile(sProtokollDuplikate, ForWriting, True)
'Zieldatei öffnen; ev bereits vorhandene Datei überschreiben  
Set oSortiert = fso.OpenTextFile(sSortiert, ForWriting, True)
'Startwerte für Satzvergleich setzen  
sPrevURL = ""   
sPrevText = ""  
lCounter = 0 'Zähler für geschriebene Sätze  
DataList.MoveFirst 'beim ersten Datensatz beginnen ...  
Do Until DataList.EOF '... und bis zum letzten durchgehen  
	'Unterschied zum vorhergehenden Datensatz?  
	If LCase(DataList.Fields.Item("URL")) <> LCase(sPrevURL) Or _  
	   LCase(DataList.Fields.Item("Text")) <> LCase(sPrevText) Then  
		'keine Übereinstimmung beider Felder mit vorigem Datensatz, daher  
		'Ausgabezeile zusammensetzen und schreiben  
		oSortiert.WriteLine "<p><a href=""" & _  
			DataList.Fields.Item("URL") & _  
			""">" & _  
			DataList.Fields.Item("Text") & _  
			"</a></p>"  
		lCounter = lCounter + 1 'Zähler erhöhen  
		'letzte geschriebene Daten merken  
		sPrevURL = DataList.Fields.Item("URL")  
		sPrevText = DataList.Fields.Item("Text")  
		Else 
		oProtokollDuplikate.WriteLine "zu " & Right("    " & CStr(lCounter), 4) & ": " & _  
						"<p><a href=""" & _  
						DataList.Fields.Item("URL") & _  
						""">" & _  
						DataList.Fields.Item("Text") & _  
						"</a></p>"  

	End If
	'nächsten Datensatz auswählen  
	DataList.MoveNext
Loop
'Ausgabedatei schließen  
oSortiert.Close
'ProtokollDuplikateDatei schließen  
oProtokollDuplikate.Close
'Anzahl Datensätze ausgeben  
MsgBox Right("____" & CStr(lInCounter), 4) & "__ Datensätze eingelesen " & vbCrLF & _  
	   Right("____" & CStr(lInCounter - DataList.RecordCount), 4) & "__ fehlerhafte Zeilen entfernt " & vbCrLF & vbCrLF & _  
	   Right("____" & CStr(lCounter), 4) & "__ Datensätze im Ergebnis " & vbCrLF & _  
	   Right("____" & CStr(DataList.RecordCount - lCounter), 4) & "__ Duplikatzeilen entfernt ", _  
	   vbOK, "Statistik"  

Danke für Deine Geduld, Dein Engagement, Deine Sachkunde, Deine Freundlichkeit, und und und.
Gruß
Fränky
Member: bastla
bastla Aug 28, 2007 at 17:48:08 (UTC)
Goto Top
Hallo Fraenky!

Gratuliere - Du hast den Code an der richtigen Stelle platziert. face-smile

Es freut mich, das "Projekt" hiermit als abgeschlossen betrachten zu dürfen (Du könntest diese Tatsache durch Setzen des grünen "Erledigt"-Hakens noch zusätzlich dokumentieren) - auch, weil ich in der nächsten Zeit nicht mehr so viel Zeit wie besonders in den letzten beiden Wochen für das Forum insgesamt und ein einzelnes Thema im Besonderen werde erübrigen können.

Bei Deinem nächstes Scripting-Vorhaben, zu dem ich Dir alles Gute wünsche, wirst Du hoffentlich auch von anderer Seite Unterstützung erhalten, oder, noch besser, viel weniger auf solche angewiesen sein ...

Grüße
bastla
Member: Fraenky
Fraenky Aug 28, 2007 at 19:29:26 (UTC)
Goto Top
Hallo Bastla.
Alles klar. Ich habe gerade einen Ablaufplan geschrieben, den ich in einem neuen Beitrag ins Forum jetzt einstelle.
Vielleicht schafst Du es ja heute noch, diesen Umzusetzen.
Ansonsten wünsche ich Dir ales Gute auf Deinen Wegen
Fränky
Member: Biber
Biber Aug 28, 2007 at 20:10:40 (UTC)
Goto Top
Moin Fraenky,

ein höchst lehrreicher und unterhaltsamer Beitrag mit vielen schönen Nebeneffekten.

Unter anderem der Verbesserungsvorschlag zur Besser-Formatierung von Bandwurm-Threads
und dem von Dir gefundenen Link auf Microsoft Windows 2000 - Scripting-Handbuch (Teil 1)
- den Link habe ich gleich mal neu unter "empfehlenswerte Linx" eingetragen.

Unser aller Dank und Bewunderung gilt auch bastla für seine grenzenlose Geduld....
sicherlich haben viele MitleserInnen sich -genau wie ich- während der letzten 5000 Zeilen nicht eingemischt, um abzuwarten, ob ihr beide das bis zu einem entspannten Abschluss oder nur zu einem Guinness-Eintrag für den längsten Thread des Forums bringt.

Ich freue mich jedenfalls, dass ich diesen Thread heute schließen kann und denke, ihr beide habt nicht das Gefühl, dass es nur 5 Tage gedauert hat....
Es muss sich zwischendurch angefühlt haben wie 5 Wochen.. face-wink

Danke allen Mitwirkenden
Biber