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
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
Please also mark the comments that contributed to the solution of the article
Content-ID: 66951
Url: https://administrator.de/contentid/66951
Printed on: December 14, 2024 at 19:12 o'clock
67 Comments
Latest comment
Mit VBScript kann ich dir nicht behilflich sein, ich hätte allerdings einen anderen Vorschlag:
Wenn der Code nach folgendem Muster aufgebaut ist,
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
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
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.
;)
An dem Teil könnte man schön einen bubblesort erklären.
;)
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
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
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:
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:
Grüße
bastla
P.S.: Ev Fehler habe ich extra für Dich (zu Übungszwecken) eingebaut ...
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
""">"
Chr(34) & ">"
Grüße
bastla
P.S.: Ev Fehler habe ich extra für Dich (zu Übungszwecken) eingebaut ...
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" ... [/Edit]
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" ... [/Edit]
Hallo Fraenky!
Allerdings läuft das Script bei mir mit Deinen (wenigen) Beispielsdaten erfolgreich und mit dem gewünschten Ergebnis durch ...
Grüße
bastla
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 ... *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
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
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
oder, bei mehreren solcher Ausgaben, zur Unterscheidung ein
zu setzen - damit wird automatisch bei Ausführung dieser Zeile in den Direktbereich geschrieben.
Grüße
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 ...
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
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
Debug.Print "Variable sText: " & sText
Grüße
bastla
Hallo Fraenky!
Um beim zitierten Beispiel aus Deiner ersten Zeile
zu bleiben: In aZeile(2) steht nach dem Einlesen
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:
Es wird also in sText zunächst einmal gespeichert:
Mit der nächsten Zeile
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:
Ein Umdrehen der Zeichen "<" und ">" hätte also eigentlich nicht erforderlich sein sollen ...
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 .
Grüße
bastla
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>
>Regina</a></p>
sText = Left(aZeile(2), InStr(aZeile(2), "<") - 1) 'bis zum ersten "<"
>Regina
sText = Mid(sText, InStrRev(sText, ">") + 1) 'ab dem letzten ">"
Regina
= bei über 2000 Einträgen. ( Alt GR - Strg - Entf )
Hatte ich gelegentlich das Stichwort "Testdaten" erwähnt? 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 .
Grüße
bastla
Hallo Fraenky!
Auch das lässt sich natürlich mit einer MsgBox darstellen:
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:
Ä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 ...
Grüße
bastla
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).Zeichen 3
Ungültiger Prozeduraufruf oder ungültiges Argument: "Left"
Auch das lässt sich natürlich mit einer MsgBox darstellen:
MsgBox InStr(aZeile(2), "<")
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 ... Grüße
bastla
Hallo Fraenky!
Grüße
bastla
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
... Nachtrag: Wenn ich
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":
Entspricht die Formatierung des Ergebnisses nicht Deinen Wünschen (die Sortierung von HTML-Ersetzungen wie "ã" war weder versprochen noch versucht)?
Grüße
bastla
<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ão</a><br>
<a href="Pfad/Adonai.php">Adonai</a></p>
<p><a href="Pfad/adoro.php">Adoro</a></p>
<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ã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>
Grüße
bastla
Hallo Fraenky!
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!)
- 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
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")
durch folgende Zeilen ersetzen:
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
das "Or" in ein "And" ändertest, also auf
könntest Du die Ergebnisdaten auf vollständige Links beschränken.
Grüße
bastla
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!).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 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>
- nicht enthalten ist,
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
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
If aZeile(1) <> "" Or sText <> "" Then 'zumindest ein Eintrag
If aZeile(1) <> "" And sText <> "" Then 'beide Einträge erforderlich
Grüße
bastla
Hallo Fraenky!
"" 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 ).
Grüße
bastla
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"Wenn aZeile(1), also die URL, <> "" , also leere Umschließungen enthält, UND /ODER sText, also Linkname, auch, Then Löschen
"" 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 ).
Grüße
bastla
Hallo Fraenky!
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
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
Hallo Fraenky!
In der Zeile 55 waren einige Zeichen am Ende abhanden gekommen - sie sollte so aussehen:
Grüße
bastla
P.S.: Das war's für heute von mir ...
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 ...
Hallo Fraenky!
Das Script kommt in der aktuellen Fassung mit Linkzeilen folgenden Aufbaues zurecht:
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:
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
in "sText" zwischengespeichert und dann alles nach dem letzten (idR einzigen) ">" als endgültiger Link-Text in "sText" geschrieben wird:
Auch hier könnte noch ein zusätzliches "Trim()" Leerstellen an den Rändern eliminieren - die ergänzte Zeile würde dann so aussehen:
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:
brächte wegen des fehlenden "<" unmittelbar nach dem Link-Text folgendes Zerlegungs-Ergebnis:
Wenn Du also solche fehlerhafte "Original"-Zeilen findest, dann poste diese bitte - mit Andeutungen über fehlerhafte Ergebnisse kann hier wohl niemand etwas anfangen ...
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
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 ...>
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
LinkText
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>
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
Hallo Fraenky!
Erklärung für die vielen leeren Links: In Deinem Script befindet sich die Zeile
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
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):
als "Unsortiert.txt" bringt (mit jedem der beiden Sortierkriterien) folgende "Sortiert.txt":
Natürlich fehlen die beiden Links aus der Zeile
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.
nicht nur um das schließende Anführungszeichen, sondern auch um das > zum Schließen des "<a>"-Tags zu ergänzen, woraus sich
ergibt.
Danach folgt dann (in Zeile 57) das Hinzufügen des Link-Textes - was also wäre daran falsch?
Grüße
bastla
Erklärung für die vielen leeren Links: In Deinem Script befindet sich die Zeile
DataList.AddNew 'neuen Datensatz erstellen
Do While Not oUnSortiert.AtEndOfStream 'Schleife bis zum Dateiende
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ç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ê</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ó</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ãe Natureza</a></p>
<p><a href="../../../Pfad/M%E3e_Protetora.php">Mãe Protetora</a></p>
<p><a href="../../../Pfad/Pai_Oxossi.php">Pai Oxossi</a><br>
<a href="../../../Pfad/Pai_Tom%E9.php">Pai Tomé</a><br>
<a href="../../../Pfad/Pai_Xang%F4.php">Pai Xangô</a></p>
<p><a href="../../../Pfad/Aben%E7oando.php">Abenç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ê</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ãe Natureza</a></p>
<p><a href="../../../Pfad/M%E3e_Protetora.php">Mã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é</a></p>
<p><a href="../../../Pfad/Pai_Xang%F4.php">Pai Xangô</a></p>
<a href="../../../Pfad/Kau%F3.php">Kauó</a><a href="../../../Pfad/Kether.php"><br>Kether<br>
LinkText<
Fehler gefunden
ist mir ziemlich unklar - für welche Linkzeile entsteht der Fehler, wie wirkt er sich genau aus?Fehler gefunden
Zeile Zeile 56 ist ein > mit eingeschlossen.
Das in Zeile 56 eingeschlossene > ist erforderlich, um<a href="URL
<a href="URL">
Danach folgt dann (in Zeile 57) das Hinzufügen des Link-Textes - was also wäre daran falsch?
Grüße
bastla
Hallo Fraenky!
Zu Deinem "Versuch einer Interpretation": Ich beschränke mich auf Ergänzungen / Richtigstellungen - die nicht kommentierten Interpretationen sind OK
Da die Zählung bei 0 beginnt, wird hier auf 2 (für insgesamt 3 Teile) geprüft und nur dann wie folgt verarbeitet
würde auch "<br>" entfernt (ab dem letzten ">", also von rechts betrachtet dem ersten gefundenen ">")
Das Gesamtkonstrukt umfasst also:
"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
Grüße
bastla
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"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
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 werdenHier wird mit den Zahlen Zugriffsrechte zugewiesen, wie nur lesen, nur schreiben usw
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 ...Was sind Dateisystemzugriffe?
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) verbessernConst 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
Zur Datenverwaltung, wozu auch die Sortierung zählt - eigentlicher Anlass für die Verwendung dieses ObjektesHier 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.
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 darfHier 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.
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" angesprochenSetze Quelldatei = Dateisystemzugriff Öffnen ( Quelldatei, ForReading = 1)
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ätzeMache, weil nicht Quelldatei am Ende
Loop
Beendet Schleife
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.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
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)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
UBound = Upper Bound = Obergrenze = höchster IndexwertWenn geteilte Zeile = 2 (0,1,2) dann folgendes
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)'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>
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
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" etwaHier wird das erste Zeichen entfernt
sText = Verdadeira
><br>Verdadeira
DataList("URL") = aZeile(1) 'Feld "URL" befüllen
Hier wird in das Datenbankobjekt DataList Feld URL der 2.Teil eingetragen
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
Hier wird in das Datenbankobjekt DataList Feld sText der 3 Teil eingetragen
DataList.Update '... und Datensatz eintragen
Satz wird in Datenbankobjekt 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 CodeWenn anderer Satzaufbau, also keine "" vorhanden
End If
Wann ist die Bedingung erfüllt?
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
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)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
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" bereitErstelle Datei oSortiert , öffne Datei, zum schreiben, ohne Nachfrage
DataList.MoveFirst 'beim ersten Datensatz beginnen ...
Nimmt den ersten Datensatz im Datenbankobjekt
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ätzeMache solange bis DataList ist EndOfFile
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ügtDataList.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>"
"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
Der nächst Datensatz wird angesteuert
Loop
Solange, biswahrscheinlich 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 ...") vorgenommenSolange, bis
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ührenAm Ende, fein säuberlich, die sortierte Datei schließen.
Grüße
bastla
Hallo Fraenky!
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
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):
Grüße
bastla
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
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
Hallo Fraenky!
Teste bitte nochmals mit der vorhin von mir geposteten Script-Version!
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:
Grüße
bastla
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.Kann man dieses durch Operationen in der Datenbank verhindern, oder muß das an anderer Stelle geschehen.
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
Hallo Fraenky!
Der Vergleich erfolgt jetzt mit (temporär) in Kleinbuchstaben umgewandelten Werten ...
Grüße
bastla
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.Hier wird in sPrevURL das Feld URL aus Datenbank zugewiesen. Dann müste der erste Durchlauf leer erfolgen.
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)
Grüße
bastla
Hallo Fraenky!
folgende "Sortiert.txt":
Damit habe ich kein Problem.
Bei Dir gibt es mit dem aktuellsten Script (inkl "LCase()") weiterhin doppelte Links im Ergebnis?
Grüße
bastla
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ça</a></p>
<p><a href="../../../Pfad/Aben%E7a.php">abença</a></p>
<p><a href="../../../Pfad/aben%E7oa.php">Abençoa</a></p>
<p><a href="../../../Pfad/aben%E7oa.php">abençoa</a></p>
<p><a href="../../../Pfad/aben%E7oada.php">abençoada</a></p>
<p><a href="../../../Pfad/aben%E7oados.php">abençoados</a></p>
<p><a href="../../../Pfad/Aben%E7a.php">Abença</a></p>
<p><a href="../../../Pfad/Aben%E7a.php">abença</a></p>
<p><a href="../../../Pfad/aben%E7oa.php">Abençoa</a></p>
<p><a href="../../../Pfad/aben%E7oa.php">abençoa</a></p>
<p><a href="../../../Pfad/aben%E7oada.php">abençoada</a></p>
<p><a href="../../../Pfad/aben%E7oados.php">abençoados</a></p>
<p><a href="../../../Pfad/Aben%E7a.php">Abença</a></p>
<p><a href="../../../Pfad/aben%E7oa.php">Abençoa</a></p>
<p><a href="../../../Pfad/aben%E7oada.php">abençoada</a></p>
<p><a href="../../../Pfad/aben%E7oados.php">abençoados</a></p>
Bei Dir gibt es mit dem aktuellsten Script (inkl "LCase()") weiterhin doppelte Links im Ergebnis?
Grüße
bastla
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.
und
nicht identisch sind ("Abença" vs "abenç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
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ça</a></p>
<p><a href="../../../Pfad/Aben%E7a.php">abença</a></p>
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
Hallo Fraenky!
Magst du uns beiden den Gefallen tun, für Deine weiteren Tests folgenden Stand des Scripts zu verwenden?
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
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)
Grüße
bastla
Hallo Fraenky!
Da mit
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.
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
Da mit
Set DataList = CreateObject("ADOR.Recordset") 'Datenbankobjekt erstellen
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. 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
Hallo Fraenky!
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
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
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:
Ä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:
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!
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!
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!
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 :
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:
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
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"
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
159 ][ <p><br>
1405 ][ Estrada do Amor</a><br>
1840 ][ <a href="../../../Pfad/Irm%E3os.php">Ir</a><a href="../../../Pfad/Irm%E3os.php">mãos</a></p>
Der folgende Protokolleintrag sollte selbsterklärend sein :
1156 Leerzeile!
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"
Grüße
bastla
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
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
Hallo Fraenky!
könntest Du noch ein
setzen, was natürlich bedingt, dass am Anfang des Scripts eine Zeile für den Pfad hinzukommt:
Analog zum Öffnen ist dann auch ein
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)
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
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.dachte, das hätten Wir beim zusammenbauen der Satzteile schon erledigt.
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)
Set oProtokollDuplikate = fso.OpenTextFile(sProtokollDuplikate, ForWriting, True)
sProtokollDuplikate = "C:\skript\Liste_sort\ProtokollDuplikate.txt" 'Protokoll für doppelte Sätze
oProtokollDuplikate.Close
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>"
Die zusätzliche Ausgabe der Zeilennummer ermöglicht dann den direkten Vergleich mit den Zeilen der "Sortiert.txt".
Grüße
bastla
Hallo Fraenky!
Gratuliere - Du hast den Code an der richtigen Stelle platziert.
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
Gratuliere - Du hast den Code an der richtigen Stelle platziert.
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
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..
Danke allen Mitwirkenden
Biber
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..
Danke allen Mitwirkenden
Biber