Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst Mit VB Script eine Linkliste alphabethisch ordnen lassen.

Mitglied: Fraenky

Fraenky (Level 1) - Jetzt verbinden

23.08.2007, aktualisiert 18.10.2012, 14144 Aufrufe, 67 Kommentare

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
67 Antworten
Mitglied: TuXHunt3R
23.08.2007 um 20:58 Uhr
Mit VBScript kann ich dir nicht behilflich sein, ich hätte allerdings einen anderen Vorschlag:


Wenn der Code nach folgendem Muster aufgebaut ist,

01.
 
02.
<p><a href="http://www.google.ch">Google</a></p>
03.
<p><a href="http://www.wikipedia.ch">Wikipedia</a></p>
04.
<p><a href="https://www.administrator.de">Administrator.de</a></p>
05.
 
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
Bitte warten ..
Mitglied: SvenGuenter
23.08.2007 um 21:58 Uhr
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.

;)
Bitte warten ..
Mitglied: Fraenky
23.08.2007 um 22:34 Uhr
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:
01.
  <a href="../../../test/test/test/test/test/test/test/test/test/test/test/test/test/test/test/test//Regina.php">Regina</a></p>
02.
<p><a href="../../../test/test/test/test/test/test/test/test/test/test/test/test/test/test/test/test//Rei.php">Rei</a><br>
03.
  <a href="../../../test/test/test/test/test/test/test/test/test/test/test/test/test/test/test/test//Rei_Agarrube.php">Rei 
04.
  Agarrube</a><br>
05.
  <a href="../../../test/test/test/test/test/test/test/test/test/test/test/test/test/test/test/test//Rei_Cambinda.php">Rei 
06.
  Cambinda</a><br>
07.
  <a href="../../../test/test/test/test/test/test/test/test/test/test/test/test/test/test/test/test//Rei_Congo.php">Rei 
08.
  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
Bitte warten ..
Mitglied: SvenGuenter
24.08.2007 um 08:04 Uhr
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
Bitte warten ..
Mitglied: Fraenky
24.08.2007 um 09:41 Uhr
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
Bitte warten ..
Mitglied: SvenGuenter
24.08.2007 um 12:44 Uhr
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
Bitte warten ..
Mitglied: bastla
24.08.2007 um 15:06 Uhr
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:
01.
sUnsortiert = "D:\Unsortiert.txt" 'Quelldatei
02.
sSortiert = "D:\Sortiert.txt"     'Zieldatei
03.
 
04.
Const ForReading = 1, ForWriting = 2, ForAppending = 8 'Öffnungsarten für Textdateien
05.
Set fso = CreateObject("Scripting.FileSystemObject") 'für Dateisystemzugriffe
06.
 
07.
'für die Definition der Datenfelder (siehe verlinkter Artikel)
08.
Const adVarChar = 200
09.
Const MaxCharacters = 255
10.
Const adFldIsNullable = 32
11.
 
12.
Set DataList = CreateObject("ADOR.Recordset") 'Datenbankobjekt erstellen
13.
DataList.Fields.Append "URL", adVarChar, MaxCharacters, adFldIsNullable  'Feld "URL" definieren
14.
DataList.Fields.Append "Text", adVarChar, MaxCharacters, adFldIsNullable 'Feld "Text" definieren
15.
DataList.Open
16.
 
17.
Set oUnsortiert = fso.OpenTextFile(sUnsortiert, ForReading) 'Unsortierte Datei zum Lesen öffnen
18.
Do While Not oUnSortiert.AtEndOfStream 'Schleife bis zum Dateiende
19.
	DataList.AddNew 'neuen Datensatz erstellen
20.
	aZeile = Split(oUnsortiert.ReadLine, """") 'Zeile einlesen und an den Anführungszeichen zerteilen
21.
	If UBound(aZeile) = 2 Then '2 Anführungszeichen gefunden - 3 Teile:
22.
		'1. Teil = aZeile(0): alles vor URL (vor dem ersten Anführungszeichen)
23.
		'2. Teil = aZeile(1): URL (gefunden zwischen Anführungszeichen)
24.
		'3. Teil = aZeile(2): alles nach URL (nach dem zweiten Anführungszeichen)
25.
 
26.
		'Zerlegung des 3. Teiles:
27.
		sText = Left(aZeile(2), InStr(aZeile(2), "<") - 1) 'bis zum ersten "<"
28.
		sText = Mid(sText, InStrRev(sText, ">") + 1) 'ab dem letzten ">"
29.
		DataList("URL") = aZeile(1) 'Feld "URL" befüllen
30.
		DataList("Text") = sText    'Feld "Text" befüllen 
31.
		DataList.Update '...  und Datensatz eintragen
32.
	Else
33.
		'anderer Zeilenaufbau - wäre näher zu untersuchen
34.
	End If
35.
Loop
36.
oUnsortiert.Close 'Eingabedatei schließen
37.
 
38.
'Sortierkriterium feststellen - Billigvariante ;-)
39.
R = MsgBox("Sortierung nach Name (Ja) oder nach URL (Nein)?", vbYesNo)
40.
If R = vbYes Then
41.
	DataList.Sort = "Text"
42.
Else
43.
	DataList.Sort = "URL"	
44.
End If
45.
 
46.
'Zieldatei öffnen; ev bereits vorhandene Datei überschreiben
47.
Set oSortiert = fso.OpenTextFile(sSortiert, ForWriting, True)
48.
DataList.MoveFirst 'beim ersten Datensatz beginnen ...
49.
Do Until DataList.EOF '... und bis zum letzten durchgehen
50.
	'Ausgabezeile zusammensetzen und schreiben
51.
	oSortiert.WriteLine "<p><a href=""" & _
52.
		DataList.Fields.Item("URL") & _
53.
		""">" & _
54.
		DataList.Fields.Item("Text") & _
55.
		"</a></p>"
56.
	'nächsten Datensatz auswählen
57.
	DataList.MoveNext
58.
Loop
59.
'Ausgabedatei schließen
60.
oSortiert.Close
Falls Dich die Schreibweise
01.
""">"
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:
01.
Chr(34) & ">"
Grüße
bastla

P.S.: Ev Fehler habe ich extra für Dich (zu Übungszwecken) eingebaut ...
Bitte warten ..
Mitglied: Fraenky
24.08.2007 um 16:11 Uhr
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.
Bitte warten ..
Mitglied: Fraenky
24.08.2007 um 16:15 Uhr
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.
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
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
Bitte warten ..
Mitglied: bastla
24.08.2007 um 16:20 Uhr
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]
Bitte warten ..
Mitglied: bastla
25.08.2007 um 01:53 Uhr
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 ... *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
Bitte warten ..
Mitglied: Fraenky
25.08.2007 um 02:09 Uhr
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
Bitte warten ..
Mitglied: bastla
25.08.2007 um 02:23 Uhr
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
01.
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
01.
Debug.Print sText
oder, bei mehreren solcher Ausgaben, zur Unterscheidung ein
01.
Debug.Print "Variable sText: " & sText
zu setzen - damit wird automatisch bei Ausführung dieser Zeile in den Direktbereich geschrieben.

Grüße
bastla
Bitte warten ..
Mitglied: Fraenky
25.08.2007 um 10:26 Uhr
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.
Bitte warten ..
Mitglied: Fraenky
25.08.2007 um 11:35 Uhr
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 ...

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. = 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
01.
MsgBox sText
02.
> 
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.
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
Bitte warten ..
Mitglied: bastla
25.08.2007, aktualisiert 18.10.2012
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
01.
<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
01.
>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:
01.
sText = Left(aZeile(2), InStr(aZeile(2), "<") - 1) 'bis zum ersten "<"
Es wird also in sText zunächst einmal gespeichert:
01.
>Regina
Mit der nächsten Zeile
01.
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:
01.
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? 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
Bitte warten ..
Mitglied: Fraenky
25.08.2007 um 14:40 Uhr
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?
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
Bitte warten ..
Mitglied: bastla
25.08.2007 um 15:16 Uhr
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:
01.
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:
01.
If InStr(aZeile(2), "<") > 1 Then
02.
    'weiter bearbeiten nach Standard-Algorithmus
03.
Else
04.
    'Inhalt genauer untersuchen - Kriterien?
05.
    'oder Linktext konstruieren
06.
    'und / oder Logeintrag für Datensatz erstellen;
07.
        'zum Rekonstruieren der gesamten Zeile zB
08.
            'sGanzeZeile = Join(aZeile, """")
09.
        'verwenden.
10.
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 Nachbarschaft oder in den Links 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
Bitte warten ..
Mitglied: Fraenky
25.08.2007 um 16:33 Uhr
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
Gruß Fränky
Bitte warten ..
Mitglied: bastla
25.08.2007 um 17:47 Uhr
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
Bitte warten ..
Mitglied: bastla
25.08.2007 um 18:13 Uhr
... Nachtrag: Wenn ich
01.
<p><a href="Pfad/acredito.php">acredito</a></p>
02.
<p><a href="Pfad/acreditou.php">acreditou</a><br>
03.
<a href="Pfad/Adam.php">Adam</a><br>
04.
<a href="Pfad/Ad%E3o.php">Ad&atilde;o</a><br>
05.
<a href="Pfad/Adonai.php">Adonai</a></p>
06.
<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":
01.
<p><a href="Pfad/acredito.php">acredito</a></p>
02.
<p><a href="Pfad/acreditou.php">acreditou</a></p>
03.
<p><a href="Pfad/Ad%E3o.php">Ad&atilde;o</a></p>
04.
<p><a href="Pfad/Adam.php">Adam</a></p>
05.
<p><a href="Pfad/Adonai.php">Adonai</a></p>
06.
<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
Bitte warten ..
Mitglied: Fraenky
25.08.2007 um 19:07 Uhr
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
Bitte warten ..
Mitglied: bastla
25.08.2007 um 20:05 Uhr
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
01.
<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")
01.
	DataList.AddNew 'neuen Datensatz erstellen
02.
	aZeile = Split(oUnsortiert.ReadLine, """") 'Zeile einlesen und an den Anführungszeichen zerteilen
03.
	If UBound(aZeile) = 2 Then '2 Anführungszeichen gefunden - 3 Teile:
04.
		'1. Teil = aZeile(0): alles vor URL (vor dem ersten Anführungszeichen)
05.
		'2. Teil = aZeile(1): URL (gefunden zwischen Anführungszeichen)
06.
		'3. Teil = aZeile(2): alles nach URL (nach dem zweiten Anführungszeichen)
07.
 
08.
		'Zerlegung des 3. Teiles:
09.
		sText = Left(aZeile(2), InStr(aZeile(2), "<") - 1) 'bis zum ersten "<"
10.
		sText = Mid(sText, InStrRev(sText, ">") + 1) 'ab dem letzten ">"
11.
		DataList("URL") = aZeile(1) 'Feld "URL" befüllen
12.
		DataList("Text") = sText    'Feld "Text" befüllen 
13.
		DataList.Update '...  und Datensatz eintragen
durch folgende Zeilen ersetzen:
01.
 	aZeile = Split(oUnsortiert.ReadLine, """") 'Zeile einlesen und an den Anführungszeichen zerteilen
02.
	If UBound(aZeile) = 2 Then '2 Anführungszeichen gefunden - 3 Teile:
03.
		'1. Teil = aZeile(0): alles vor URL (vor dem ersten Anführungszeichen)
04.
		'2. Teil = aZeile(1): URL (gefunden zwischen Anführungszeichen)
05.
		'3. Teil = aZeile(2): alles nach URL (nach dem zweiten Anführungszeichen)
06.
 
07.
		'Zerlegung des 3. Teiles:
08.
		sText = Left(aZeile(2), InStr(aZeile(2), "<") - 1) 'bis zum ersten "<"
09.
		sText = Mid(sText, InStrRev(sText, ">") + 1) 'ab dem letzten ">"
10.
		If aZeile(1) <> "" Or sText <> "" Then 'zumindest ein Eintrag
11.
			DataList.AddNew 'neuen Datensatz erstellen
12.
			DataList("URL") = aZeile(1) 'Feld "URL" befüllen
13.
			DataList("Text") = sText    'Feld "Text" befüllen 
14.
			DataList.Update '...  und Datensatz eintragen
15.
		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
01.
		If aZeile(1) <> "" Or sText <> "" Then 'zumindest ein Eintrag
das "Or" in ein "And" ändertest, also auf
01.
		If aZeile(1) <> "" And sText <> "" Then 'beide Einträge erforderlich
könntest Du die Ergebnisdaten auf vollständige Links beschränken.

Grüße
bastla
Bitte warten ..
Mitglied: Fraenky
25.08.2007 um 21:43 Uhr
Hallo Bastla.
Mann könnte auch sagen, füge Zeile
If aZeile(1) <> "" Or sText <> "" Then 'zumindest ein Eintrag
ein.
gruß
Fränky
Bitte warten ..
Mitglied: bastla
25.08.2007 um 21:53 Uhr
Hallo Fraenky!

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

Grüße
bastla
Bitte warten ..
Mitglied: Fraenky
25.08.2007 um 22:11 Uhr
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
Bitte warten ..
Mitglied: bastla
25.08.2007 um 22:30 Uhr
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 ).

Grüße
bastla
Bitte warten ..
Mitglied: Fraenky
25.08.2007 um 22:59 Uhr
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
Bitte warten ..
Mitglied: bastla
25.08.2007 um 23:20 Uhr
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
Bitte warten ..
Mitglied: Fraenky
25.08.2007 um 23:41 Uhr
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:

01.
sUnsortiert = "C:\skript\Liste_sort\liste.txt" 'Quelldatei
02.
sSortiert = "C:\skript\Liste_sort\Sortiert.txt"     'Zieldatei
03.
 
04.
Const ForReading = 1, ForWriting = 2, ForAppending = 8 'Öffnungsarten für Textdateien
05.
Set fso = CreateObject("Scripting.FileSystemObject") 'für Dateisystemzugriffe
06.
 
07.
'für die Definition der Datenfelder (siehe verlinkter Artikel)
08.
Const adVarChar = 200
09.
Const MaxCharacters = 255
10.
Const adFldIsNullable = 32
11.
 
12.
Set DataList = CreateObject("ADOR.Recordset") 'Datenbankobjekt erstellen
13.
DataList.Fields.Append "URL", adVarChar, MaxCharacters, adFldIsNullable  'Feld "URL" definieren
14.
DataList.Fields.Append "Text", adVarChar, MaxCharacters, adFldIsNullable 'Feld "Text" definieren
15.
DataList.Open
16.
 
17.
Set oUnsortiert = fso.OpenTextFile(sUnsortiert, ForReading) 'Unsortierte Datei zum Lesen öffnen
18.
Do While Not oUnSortiert.AtEndOfStream 'Schleife bis zum Dateiende
19.
	DataList.AddNew 'neuen Datensatz erstellen
20.
	aZeile = Split(oUnsortiert.ReadLine, """") 'Zeile einlesen und an den Anführungszeichen zerteilen
21.
	If UBound(aZeile) = 2 Then '2 Anführungszeichen gefunden - 3 Teile:
22.
		'1. Teil = aZeile(0): alles vor URL (vor dem ersten Anführungszeichen)
23.
		'2. Teil = aZeile(1): URL (gefunden zwischen Anführungszeichen)
24.
		'3. Teil = aZeile(2): alles nach URL (nach dem zweiten Anführungszeichen)
25.
                               'Convite.php">Convite<p></p>
26.
		'Zerlegung des 3. Teiles:
27.
		sText = Left(aZeile(2), InStr(aZeile(2), "<") ) 'bis zum ersten "<"
28.
		sText = Mid(sText, InStrRev(sText, ">") + 1) 'ab dem letzten ">"
29.
If aZeile(1) <> "" Or sText <> "" Then 'zumindest ein Eintrag
30.
			DataList.AddNew 'neuen Datensatz erstellen
31.
			DataList("URL") = aZeile(1) 'Feld "URL" befüllen
32.
			DataList("Text") = sText    'Feld "Text" befüllen 
33.
			DataList.Update '...  und Datensatz eintragen
34.
		End If
35.
	Else
36.
		'anderer Zeilenaufbau - wäre näher zu untersuchen
37.
	End If
38.
Loop
39.
oUnsortiert.Close 'Eingabedatei schließen
40.
 
41.
'Sortierkriterium feststellen - Billigvariante ;-)
42.
R = MsgBox("Sortierung nach Name (Ja) oder nach URL (Nein)?", vbYesNo)
43.
If R = vbYes Then
44.
	DataList.Sort = "Text"
45.
Else
46.
	DataList.Sort = "URL"	
47.
End If
48.
 
49.
'Zieldatei öffnen; ev bereits vorhandene Datei überschreiben
50.
Set oSortiert = fso.OpenTextFile(sSortiert, ForWriting, True)
51.
DataList.MoveFirst 'beim ersten Datensatz beginnen ...
52.
Do Until DataList.EOF '... und bis zum letzten durchgehen
53.
	'Ausgabezeile zusammensetzen und schreiben
54.
	oSortiert.WriteLine "<p><a href=""" & _
55.
		DataList.Fields.Item("URL
56.
		""">" & _
57.
		DataList.Fields.Item("Text") & _
58.
		"</a></p>"
59.
	'nächsten Datensatz auswählen
60.
	DataList.MoveNext
61.
Loop
62.
'Ausgabedatei schließen
63.
oSortiert.Close
Bis dann
Fränky
Bitte warten ..
Mitglied: bastla
25.08.2007 um 23:51 Uhr
Hallo Fraenky!

In der Zeile 55 waren einige Zeichen am Ende abhanden gekommen - sie sollte so aussehen:
01.
		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 ...
Bitte warten ..
Mitglied: Fraenky
26.08.2007 um 00:28 Uhr
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">Rei
Jagube</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
Bitte warten ..
Mitglied: bastla
26.08.2007 um 10:48 Uhr
Hallo Fraenky!

Das Script kommt in der aktuellen Fassung mit Linkzeilen folgenden Aufbaues zurecht:
01.
<...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
01.
... 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:
01.
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:
01.
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:
01.
<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:
01.
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
Bitte warten ..
Mitglied: Fraenky
26.08.2007 um 14:58 Uhr
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
Bitte warten ..
Mitglied: Fraenky
26.08.2007 um 15:56 Uhr
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
Bitte warten ..
Mitglied: Fraenky
26.08.2007 um 18:37 Uhr
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
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
Bitte warten ..
Mitglied: bastla
26.08.2007 um 19:21 Uhr
Hallo Fraenky!

Erklärung für die vielen leeren Links: In Deinem Script befindet sich die Zeile
01.
        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
01.
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):
01.
<p><a href="../../../Pfad/Aben%E7oando.php">Aben&ccedil;oando</a></p>
02.
<p><a href="../../../Pfad/aberta.php">aberta</a></p>
03.
<a href="../../../Pfad/Adam.php">Adam</a><br>
04.
<p><a href="../../../Pfad/Ain_Soph.php">Ain Soph</a><br>
05.
<a href="../../../Pfad/Alafim_ex%EA.php">Alafim ex&ecirc;</a></p>
06.
<p> <a href="../../../Pfad/Flor_de_Jasmim.php">Flor de Jasmim</a></p>
07.
<a href="../../../Pfad/Ganhou.php">Ganhou</a><br>
08.
<a href="../../../Pfad/Geburah.php">Geburah</a><br>
09.
<a href="../../../Pfad/Kau%F3.php">Kau&oacute;</a><a href="../../../Pfad/Kether.php"><br>Kether<br>
10.
</a><a href="../../../Pfad/Kolibri.php">Kolibri</a><br>
11.
<p><a href="../../../Pfad/M%E3e_Natureza.php">M&atilde;e Natureza</a></p>
12.
<p><a href="../../../Pfad/M%E3e_Protetora.php">M&atilde;e Protetora</a></p>
13.
<p><a href="../../../Pfad/Pai_Oxossi.php">Pai Oxossi</a><br>
14.
<a href="../../../Pfad/Pai_Tom%E9.php">Pai Tom&eacute;</a><br>
15.
<a href="../../../Pfad/Pai_Xang%F4.php">Pai Xang&ocirc;</a></p>
als "Unsortiert.txt" bringt (mit jedem der beiden Sortierkriterien) folgende "Sortiert.txt":
01.
<p><a href="../../../Pfad/Aben%E7oando.php">Aben&ccedil;oando</a></p>
02.
<p><a href="../../../Pfad/aberta.php">aberta</a></p>
03.
<p><a href="../../../Pfad/Adam.php">Adam</a></p>
04.
<p><a href="../../../Pfad/Ain_Soph.php">Ain Soph</a></p>
05.
<p><a href="../../../Pfad/Alafim_ex%EA.php">Alafim ex&ecirc;</a></p>
06.
<p><a href="../../../Pfad/Flor_de_Jasmim.php">Flor de Jasmim</a></p>
07.
<p><a href="../../../Pfad/Ganhou.php">Ganhou</a></p>
08.
<p><a href="../../../Pfad/Geburah.php">Geburah</a></p>
09.
<p><a href="../../../Pfad/Kolibri.php">Kolibri</a></p>
10.
<p><a href="../../../Pfad/M%E3e_Natureza.php">M&atilde;e Natureza</a></p>
11.
<p><a href="../../../Pfad/M%E3e_Protetora.php">M&atilde;e Protetora</a></p>
12.
<p><a href="../../../Pfad/Pai_Oxossi.php">Pai Oxossi</a></p>
13.
<p><a href="../../../Pfad/Pai_Tom%E9.php">Pai Tom&eacute;</a></p>
14.
<p><a href="../../../Pfad/Pai_Xang%F4.php">Pai Xang&ocirc;</a></p>
Natürlich fehlen die beiden Links aus der Zeile
01.
<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
01.
<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
01.
<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
Bitte warten ..
Mitglied: Fraenky
26.08.2007 um 20:44 Uhr
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
Bitte warten ..
Mitglied: bastla
26.08.2007 um 21:05 Uhr
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
01.
><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:
01.
If "Bedingung(en)" Then
02.
	Code für "Bedingung(en) erfüllt"
03.
Else
04.
	Code für "Bedingung(en) nicht erfüllt"
05.
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
Bitte warten ..
Mitglied: bastla
26.08.2007 um 21:47 Uhr
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
01.
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):
01.
sUnsortiert = "C:\skript\Liste_sort\liste.txt"    'Quelldatei
02.
sSortiert = "C:\skript\Liste_sort\Sortiert.txt"   'Zieldatei
03.
sProtokoll = "C:\skript\Liste_sort\Protokoll.txt" 'Protokoll für nicht verarbeitete Sätze
04.
 
05.
Const ForReading = 1, ForWriting = 2, ForAppending = 8 'Öffnungsarten für Textdateien
06.
Set fso = CreateObject("Scripting.FileSystemObject") 'für Dateisystemzugriffe
07.
 
08.
'für die Definition der Datenfelder (siehe verlinkter Artikel)
09.
Const adVarChar = 200
10.
Const MaxCharacters = 255
11.
Const adFldIsNullable = 32
12.
 
13.
Set DataList = CreateObject("ADOR.Recordset") 'Datenbankobjekt erstellen
14.
DataList.Fields.Append "URL", adVarChar, MaxCharacters, adFldIsNullable  'Feld "URL" definieren
15.
DataList.Fields.Append "Text", adVarChar, MaxCharacters, adFldIsNullable 'Feld "Text" definieren
16.
DataList.Open
17.
 
18.
Set oUnsortiert = fso.OpenTextFile(sUnsortiert, ForReading) 'Unsortierte Datei zum Lesen öffnen
19.
Set oProtokoll = fso.OpenTextFile(sProtokoll, ForWriting, True) 'Protokolldatei zum Schreiben öffnen; altes Protokoll überschreiben
20.
Do While Not oUnSortiert.AtEndOfStream 'Schleife bis zum Dateiende
21.
	aZeile = Split(oUnsortiert.ReadLine, """") 'Zeile einlesen und an den Anführungszeichen zerteilen
22.
	If UBound(aZeile) = 2 Then '2 Anführungszeichen gefunden - 3 Teile:
23.
		'1. Teil = aZeile(0): alles vor URL (vor dem ersten Anführungszeichen)
24.
		'2. Teil = aZeile(1): URL (gefunden zwischen Anführungszeichen)
25.
		'3. Teil = aZeile(2): alles nach URL (nach dem zweiten Anführungszeichen)
26.
 
27.
		'Zerlegung des 3. Teiles:
28.
		sText = Left(aZeile(2), InStr(aZeile(2), "<") - 1) 'bis zum ersten "<"
29.
		sText = Mid(sText, InStrRev(sText, ">") + 1) 'ab dem letzten ">"
30.
		If aZeile(1) <> "" Or sText <> "" Then
31.
			DataList.AddNew 'neuen Datensatz erstellen
32.
			DataList("URL") = aZeile(1) 'Feld "URL" befüllen
33.
			DataList("Text") = sText    'Feld "Text" befüllen 
34.
			DataList.Update '...  und Datensatz eintragen
35.
		Else
36.
			'Eintrag in das Protokoll:
37.
				'Alle Teile zusammenfassen,
38.
				'dabei die entfernten Anführungszeichen wieder einfügen und
39.
				'Zeile in Protokolldatei schreiben
40.
			oProtokoll.WriteLine Join(aZeile, """")
41.
		End If
42.
	Else
43.
		'anderer Zeilenaufbau - wäre näher zu untersuchen
44.
		'zumindest Protokolleintrag erstellen
45.
		oProtokoll.WriteLine Join(aZeile, """")
46.
	End If
47.
Loop
48.
oUnsortiert.Close 'Eingabedatei schließen
49.
oProtokoll.Close 'Protokolldatei schließen
50.
'Sortierkriterium feststellen - Billigvariante ;-)
51.
R = MsgBox("Sortierung nach Name (Ja) oder nach URL (Nein)?", vbYesNo)
52.
If R = vbYes Then
53.
	DataList.Sort = "Text"
54.
Else
55.
	DataList.Sort = "URL"	
56.
End If
57.
 
58.
'Zieldatei öffnen; ev bereits vorhandene Datei überschreiben
59.
Set oSortiert = fso.OpenTextFile(sSortiert, ForWriting, True)
60.
DataList.MoveFirst 'beim ersten Datensatz beginnen ...
61.
Do Until DataList.EOF '... und bis zum letzten durchgehen
62.
	'Ausgabezeile zusammensetzen und schreiben
63.
	oSortiert.WriteLine "<p><a href=""" & _
64.
		DataList.Fields.Item("URL") & _
65.
		""">" & _
66.
		DataList.Fields.Item("Text") & _
67.
		"</a></p>"
68.
	'nächsten Datensatz auswählen
69.
	DataList.MoveNext
70.
Loop
71.
'Ausgabedatei schließen
72.
oSortiert.Close
73.
'Anzahl Datensätze ausgeben
74.
MsgBox "Anzahl der Datensätze im Ergebnis: " & DataList.RecordCount
Grüße
bastla
Bitte warten ..
Mitglied: Fraenky
26.08.2007 um 22:35 Uhr
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
Bitte warten ..
Mitglied: bastla
26.08.2007 um 23:12 Uhr
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:
01.
'Zieldatei öffnen; ev bereits vorhandene Datei überschreiben
02.
Set oSortiert = fso.OpenTextFile(sSortiert, ForWriting, True)
03.
'Startwerte für Satzvergleich setzen
04.
sPrevURL = "" 
05.
sPrevText = ""
06.
lCounter = 0 'Zähler für geschriebene Sätze
07.
DataList.MoveFirst 'beim ersten Datensatz beginnen ...
08.
Do Until DataList.EOF '... und bis zum letzten durchgehen
09.
	'Unterschied zum vorhergehenden Datensatz?
10.
	If DataList.Fields.Item("URL") <> sPrevURL Or _
11.
	   DataList.Fields.Item("Text") <> sPrevText Then
12.
		'keine Übereinstimmung beider Felder mit vorigem Datensatz, daher
13.
		'Ausgabezeile zusammensetzen und schreiben
14.
		oSortiert.WriteLine "<p><a href=""" & _
15.
			DataList.Fields.Item("URL") & _
16.
			""">" & _
17.
			DataList.Fields.Item("Text") & _
18.
			"</a></p>"
19.
		lCounter = lCounter + 1 'Zähler erhöhen
20.
		'letzte geschriebene Daten merken
21.
		sPrevURL = DataList.Fields.Item("URL")
22.
		sPrevText = DataList.Fields.Item("Text")
23.
	End If
24.
	'nächsten Datensatz auswählen
25.
	DataList.MoveNext
26.
Loop
27.
'Ausgabedatei schließen
28.
oSortiert.Close
29.
'Anzahl Datensätze ausgeben
30.
MsgBox "Anzahl der Datensätze im Ergebnis: " & CStr(lCounter)
Grüße
bastla
Bitte warten ..
Mitglied: Fraenky
26.08.2007 um 23:37 Uhr
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
Bitte warten ..
Mitglied: Fraenky
27.08.2007 um 00:02 Uhr
Hallo Bastla.
Hier ein Versuch mit meinen Worten

01.
Set oSortiert = fso.OpenTextFile(sSortiert, ForWriting, True)
02.
DataList.MoveFirst 'beim ersten Datensatz beginnen ...
03.
Set Zähler = 0, wenn erster Durchlauf +1
04.
Do Until DataList.EOF '... und bis zum letzten durchgehen
05.
	'Ausgabezeile zusammensetzen und schreiben
06.
	oSortiert.WriteLine "<p><a href=""" & _
07.
		DataList.Fields.Item("URL") & _
08.
		"""" & _
09.
		DataList.Fields.Item("Text") & _
10.
		"</a></p>"
11.
copy Datensatz in Doppelcheck
12.
copy nächsten Datensatz in Doppelcheck2
13.
Vergleiche beide Datensätze
14.
Wenn ungleich,  tue nichts und weiter
15.
Wenn gleich, lösche Doppelcheck2 und lösche Doppelcheck
16.
weiter
17.
	'nächsten Datensatz auswählen
18.
	DataList.MoveNext
19.
Loop
20.
 
21.
'Ausgabedatei schließen
22.
oSortiert.Close
23.
 
24.
Print Zähler
25.
Vergleiche Zähler mit Anzahl Datensätze aus DataList
26.
Wenn nicht gleich, Print in sSortiert am Ende:
27.
In sSortiert sind x Datensätze weniger als in sUnsortiert
28.
Dasselbe in einem Ausgabefenster
29.
MsgBox( Text)
Gruß
Fränky
Bitte warten ..
Mitglied: Fraenky
27.08.2007 um 01:25 Uhr
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
Bitte warten ..
Mitglied: bastla
27.08.2007 um 09:13 Uhr
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:
01.
	If LCase(DataList.Fields.Item("URL")) <> LCase(sPrevURL) Or _
02.
	   LCase(DataList.Fields.Item("Text")) <> LCase(sPrevText Then)
Der Vergleich erfolgt jetzt mit (temporär) in Kleinbuchstaben umgewandelten Werten ...

Grüße
bastla
Bitte warten ..
Mitglied: Fraenky
27.08.2007 um 10:33 Uhr
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.
Bitte warten ..
Mitglied: bastla
27.08.2007 um 12:10 Uhr
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"
01.
<p><a href="../../../Pfad/Aben%E7a.php">Aben&ccedil;a</a></p>
02.
<p><a href="../../../Pfad/Aben%E7a.php">aben&ccedil;a</a></p>
03.
<p><a href="../../../Pfad/aben%E7oa.php">Aben&ccedil;oa</a></p>
04.
<p><a href="../../../Pfad/aben%E7oa.php">aben&ccedil;oa</a></p>
05.
<p><a href="../../../Pfad/aben%E7oada.php">aben&ccedil;oada</a></p>
06.
<p><a href="../../../Pfad/aben%E7oados.php">aben&ccedil;oados</a></p>
07.
 
08.
<p><a href="../../../Pfad/Aben%E7a.php">Aben&ccedil;a</a></p>
09.
<p><a href="../../../Pfad/Aben%E7a.php">aben&ccedil;a</a></p>
10.
<p><a href="../../../Pfad/aben%E7oa.php">Aben&ccedil;oa</a></p>
11.
<p><a href="../../../Pfad/aben%E7oa.php">aben&ccedil;oa</a></p>
12.
<p><a href="../../../Pfad/aben%E7oada.php">aben&ccedil;oada</a></p>
13.
<p><a href="../../../Pfad/aben%E7oados.php">aben&ccedil;oados</a></p>
folgende "Sortiert.txt":
01.
<p><a href="../../../Pfad/Aben%E7a.php">Aben&ccedil;a</a></p>
02.
<p><a href="../../../Pfad/aben%E7oa.php">Aben&ccedil;oa</a></p>
03.
<p><a href="../../../Pfad/aben%E7oada.php">aben&ccedil;oada</a></p>
04.
<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
Bitte warten ..
Mitglied: Fraenky
27.08.2007 um 12:54 Uhr
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
Bitte warten ..
Mitglied: bastla
27.08.2007, aktualisiert 18.10.2012
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
01.
<p><a href="../../../Pfad/Aben%E7a.php">Aben&ccedil;a</a></p>
und
01.
<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
Bitte warten ..
Mitglied: Fraenky
27.08.2007 um 15:06 Uhr
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
Bitte warten ..
Mitglied: bastla
27.08.2007 um 15:21 Uhr
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?
01.
sUnsortiert = "C:\skript\Liste_sort\liste.txt"    'Quelldatei
02.
sSortiert = "C:\skript\Liste_sort\Sortiert.txt"   'Zieldatei
03.
sProtokoll = "C:\skript\Liste_sort\Protokoll.txt" 'Protokoll für nicht verarbeitete Sätze
04.
 
05.
Const ForReading = 1, ForWriting = 2, ForAppending = 8 'Öffnungsarten für Textdateien
06.
Set fso = CreateObject("Scripting.FileSystemObject") 'für Dateisystemzugriffe
07.
 
08.
'für die Definition der Datenfelder (siehe verlinkter Artikel)
09.
Const adVarChar = 200
10.
Const MaxCharacters = 255
11.
Const adFldIsNullable = 32
12.
 
13.
Set DataList = CreateObject("ADOR.Recordset") 'Datenbankobjekt erstellen
14.
DataList.Fields.Append "URL", adVarChar, MaxCharacters, adFldIsNullable  'Feld "URL" definieren
15.
DataList.Fields.Append "Text", adVarChar, MaxCharacters, adFldIsNullable 'Feld "Text" definieren
16.
DataList.Open
17.
 
18.
Set oUnsortiert = fso.OpenTextFile(sUnsortiert, ForReading) 'Unsortierte Datei zum Lesen öffnen
19.
Set oProtokoll = fso.OpenTextFile(sProtokoll, ForWriting, True) 'Protokolldatei zum Schreiben öffnen; altes Protokoll überschreiben
20.
Do While Not oUnSortiert.AtEndOfStream 'Schleife bis zum Dateiende
21.
	aZeile = Split(oUnsortiert.ReadLine, """") 'Zeile einlesen und an den Anführungszeichen zerteilen
22.
	If UBound(aZeile) = 2 Then '2 Anführungszeichen gefunden - 3 Teile:
23.
		'1. Teil = aZeile(0): alles vor URL (vor dem ersten Anführungszeichen)
24.
		'2. Teil = aZeile(1): URL (gefunden zwischen Anführungszeichen)
25.
		'3. Teil = aZeile(2): alles nach URL (nach dem zweiten Anführungszeichen)
26.
 
27.
		'Zerlegung des 3. Teiles:
28.
		sText = Left(aZeile(2), InStr(aZeile(2), "<") - 1) 'bis zum ersten "<"
29.
		sText = Mid(sText, InStrRev(sText, ">") + 1) 'ab dem letzten ">"
30.
		If aZeile(1) <> "" Or sText <> "" Then
31.
			DataList.AddNew 'neuen Datensatz erstellen
32.
			DataList("URL") = aZeile(1) 'Feld "URL" befüllen
33.
			DataList("Text") = sText    'Feld "Text" befüllen 
34.
			DataList.Update '...  und Datensatz eintragen
35.
		Else
36.
			'Eintrag in das Protokoll:
37.
				'Alle Teile zusammenfassen,
38.
				'dabei die entfernten Anführungszeichen wieder einfügen und
39.
				'Zeile in Protokolldatei schreiben
40.
			oProtokoll.WriteLine Join(aZeile, """")
41.
		End If
42.
	Else
43.
		'anderer Zeilenaufbau - wäre näher zu untersuchen
44.
		'zumindest Protokolleintrag erstellen
45.
		oProtokoll.WriteLine Join(aZeile, """")
46.
	End If
47.
Loop
48.
oUnsortiert.Close 'Eingabedatei schließen
49.
oProtokoll.Close 'Protokolldatei schließen
50.
'Sortierkriterium feststellen - Billigvariante ;-)
51.
R = MsgBox("Sortierung nach Name (Ja) oder nach URL (Nein)?", vbYesNo)
52.
If R = vbYes Then
53.
	DataList.Sort = "Text"
54.
Else
55.
	DataList.Sort = "URL"	
56.
End If
57.
 
58.
'Zieldatei öffnen; ev bereits vorhandene Datei überschreiben
59.
Set oSortiert = fso.OpenTextFile(sSortiert, ForWriting, True)
60.
'Startwerte für Satzvergleich setzen
61.
sPrevURL = "" 
62.
sPrevText = ""
63.
lCounter = 0 'Zähler für geschriebene Sätze
64.
DataList.MoveFirst 'beim ersten Datensatz beginnen ...
65.
Do Until DataList.EOF '... und bis zum letzten durchgehen
66.
	'Unterschied zum vorhergehenden Datensatz?
67.
	If LCase(DataList.Fields.Item("URL")) <> LCase(sPrevURL) Or _
68.
	   LCase(DataList.Fields.Item("Text")) <> LCase(sPrevText) Then
69.
		'keine Übereinstimmung beider Felder mit vorigem Datensatz, daher
70.
		'Ausgabezeile zusammensetzen und schreiben
71.
		oSortiert.WriteLine "<p><a href=""" & _
72.
			DataList.Fields.Item("URL") & _
73.
			""">" & _
74.
			DataList.Fields.Item("Text") & _
75.
			"</a></p>"
76.
		lCounter = lCounter + 1 'Zähler erhöhen
77.
		'letzte geschriebene Daten merken
78.
		sPrevURL = DataList.Fields.Item("URL")
79.
		sPrevText = DataList.Fields.Item("Text")
80.
	End If
81.
	'nächsten Datensatz auswählen
82.
	DataList.MoveNext
83.
Loop
84.
'Ausgabedatei schließen
85.
oSortiert.Close
86.
'Anzahl Datensätze ausgeben
87.
MsgBox "Anzahl der Datensätze im Ergebnis: " & CStr(lCounter) & vbCrLF & vbCrLF  & _
88.
	"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
Bitte warten ..
Mitglied: Fraenky
27.08.2007 um 15:24 Uhr
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
Bitte warten ..
Mitglied: bastla
27.08.2007 um 15:35 Uhr
Hallo Fraenky!

Da mit
01.
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.

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
Bitte warten ..
Mitglied: Fraenky
27.08.2007 um 17:56 Uhr
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
Bitte warten ..
Mitglied: bastla
27.08.2007 um 18:27 Uhr
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
Bitte warten ..
Mitglied: Fraenky
27.08.2007 um 19:09 Uhr
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
Bitte warten ..
Mitglied: Fraenky
27.08.2007 um 20:27 Uhr
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
Bitte warten ..
Mitglied: bastla
28.08.2007 um 00:30 Uhr
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:
01.
sUnkorrigiert = "C:\skript\Liste_sort\Original.txt" 'Quelldatei = Originalliste
02.
sKorrigiert = "C:\skript\Liste_sort\liste.txt"      'Zieldatei = Quelldatei für Sortierung
03.
sProtokollKorrektur = "C:\skript\Liste_sort\ProtokollKorrektur.txt"   'Protokoll für fehlerhafte Sätze
04.
 
05.
Const ForReading = 1, ForWriting = 2, ForAppending = 8 'Öffnungsarten für Textdateien
06.
Set fso = CreateObject("Scripting.FileSystemObject") 'für Dateisystemzugriffe
07.
 
08.
Set oUnkorrigiert = fso.OpenTextFile(sUnkorrigiert, ForReading)
09.
Set oKorrigiert = fso.OpenTextFile(sKorrigiert, ForWriting, True)
10.
Set oProtokollKorrektur = fso.OpenTextFile(sProtokollKorrektur, ForWriting, True)
11.
lInCounter = 0
12.
Do While Not oUnKorrigiert.AtEndOfStream 'Schleife bis zum Dateiende
13.
	sZeile = oUnKorrigiert.ReadLine 'Zeile einlesen
14.
	lInCounter = lIncounter + 1
15.
	If Trim(sZeile) = "" Then 'Leerzeile
16.
		oProtokollKorrektur.WriteLine Right("    " & CStr(lInCounter), 4) & "  Leerzeile!" 'im Protokoll festhalten
17.
	Else
18.
		If Right(RTrim(sZeile), 1) <> ">" Then 'Zeile endet nicht mit ">", vermutlich umgebrochen
19.
			oProtokollKorrektur.WriteLine Right("    " & CStr(lInCounter), 4) & " ## " & sZeile 'im Protokoll festhalten
20.
			sNZeile = oUnKorrigiert.ReadLine 'Nächste Zeile einlesen
21.
			lInCounter = lIncounter + 1
22.
			If Left(LTrim(sNZeile), 1) <> "<" Then 'Zeile beginnt nicht mit "<", vermutlich Fortsetzung
23.
				sZeile = RTrim(sZeile) & " " & LTrim(sNZeile) 'Zeilen verbinden; zwischen beiden Teilen nur eine Leerstelle zulassen
24.
			Else ''Zeile beginnt mit "<", normal behandeln
25.
				sZeile = sNZeile
26.
			End If
27.
		End If
28.
		aZeile = Split(sZeile, """")
29.
		If UBound(aZeile) = 2 Then '2 Anführungszeichen gefunden - 3 Teile:
30.
			If InStr(aZeile(2), "<") < 2 Then 'fehlerhafter Link-Text, im Protokoll festhalten, aber nicht bearbeiten
31.
				oProtokollKorrektur.WriteLine Right("    " & CStr(lInCounter), 4) & " -- " & sZeile
32.
			Else 'sollte OK sein
33.
				sText = Left(aZeile(2), InStr(aZeile(2), "<") - 1) 'bis zum ersten "<"
34.
				sText = Mid(sText, InStrRev(sText, ">") + 1) 'ab dem letzten ">"
35.
				If aZeile(1) <> "" Or sText <> "" Then 'nicht leer, daher ...
36.
					oKorrigiert.WriteLine sZeile '... Zeile behalten
37.
				Else 'URL und Link-Text leer
38.
					'Eintrag in das Protokoll:
39.
					oProtokoll.WriteLine Right("    " & CStr(lInCounter), 4) & " __ " & Join(aZeile, """")
40.
				End If
41.
			End If
42.
		Else
43.
		'falscher Zeilenaufbau - ausscheiden und
44.
		'Protokolleintrag erstellen
45.
		oProtokollKorrektur.WriteLine Right("    " & CStr(lInCounter), 4) & " ][ " & sZeile
46.
		End If
47.
	End If
48.
Loop
49.
oKorrigiert.Close
50.
oUnKorrigiert.Close
51.
oProtokollKorrektur.Close
52.
'Anzahl Datensätze ausgeben
53.
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:
01.
 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!
01.
 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!
01.
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!
01.
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 :
01.
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:
01.
sUnsortiert = "C:\skript\Liste_sort\liste.txt"    'Quelldatei
02.
sSortiert = "C:\skript\Liste_sort\Sortiert.txt"   'Zieldatei
03.
sProtokoll = "C:\skript\Liste_sort\Protokoll.txt" 'Protokoll für nicht verarbeitete Sätze
04.
 
05.
Const ForReading = 1, ForWriting = 2, ForAppending = 8 'Öffnungsarten für Textdateien
06.
Set fso = CreateObject("Scripting.FileSystemObject") 'für Dateisystemzugriffe
07.
 
08.
'für die Definition der Datenfelder (siehe verlinkter Artikel)
09.
Const adVarChar = 200
10.
Const MaxCharacters = 255
11.
Const adFldIsNullable = 32
12.
 
13.
Set DataList = CreateObject("ADOR.Recordset") 'Datenbankobjekt erstellen
14.
DataList.Fields.Append "URL", adVarChar, MaxCharacters, adFldIsNullable  'Feld "URL" definieren
15.
DataList.Fields.Append "Text", adVarChar, MaxCharacters, adFldIsNullable 'Feld "Text" definieren
16.
DataList.Open
17.
 
18.
Set oUnsortiert = fso.OpenTextFile(sUnsortiert, ForReading) 'Unsortierte Datei zum Lesen öffnen
19.
Set oProtokoll = fso.OpenTextFile(sProtokoll, ForWriting, True) 'Protokolldatei zum Schreiben öffnen; altes Protokoll überschreiben
20.
lInCounter = 0
21.
Do While Not oUnSortiert.AtEndOfStream 'Schleife bis zum Dateiende
22.
	aZeile = Split(oUnsortiert.ReadLine, """") 'Zeile einlesen und an den Anführungszeichen zerteilen
23.
	lInCounter = lIncounter + 1
24.
	If UBound(aZeile) = 2 Then '2 Anführungszeichen gefunden - 3 Teile:
25.
		'1. Teil = aZeile(0): alles vor URL (vor dem ersten Anführungszeichen)
26.
		'2. Teil = aZeile(1): URL (gefunden zwischen Anführungszeichen)
27.
		'3. Teil = aZeile(2): alles nach URL (nach dem zweiten Anführungszeichen)
28.
 
29.
		'Zerlegung des 3. Teiles:
30.
		If InStr(aZeile(2), "<") < 2 Then 'fehlerhafter Link-Text
31.
			oProtokoll.WriteLine Right("    " & CStr(lInCounter), 4) & " -- " & Join(aZeile, """")
32.
		Else
33.
			sText = Left(aZeile(2), InStr(aZeile(2), "<") - 1) 'bis zum ersten "<"
34.
			sText = Mid(sText, InStrRev(sText, ">") + 1) 'ab dem letzten ">"
35.
			If aZeile(1) <> "" Or sText <> "" Then
36.
				DataList.AddNew 'neuen Datensatz erstellen
37.
				DataList("URL") = aZeile(1) 'Feld "URL" befüllen
38.
				DataList("Text") = sText    'Feld "Text" befüllen 
39.
				DataList.Update '...  und Datensatz eintragen 
40.
			Else
41.
				'Eintrag in das Protokoll:
42.
					'Alle Teile zusammenfassen,
43.
					'dabei die entfernten Anführungszeichen wieder einfügen und
44.
					'Zeile in Protokolldatei schreiben
45.
				oProtokoll.WriteLine Right("    " & CStr(lInCounter), 4) & " __ " & Join(aZeile, """")
46.
			End If
47.
		End If
48.
	Else
49.
		'anderer Zeilenaufbau - wäre näher zu untersuchen
50.
		'zumindest Protokolleintrag erstellen
51.
		oProtokoll.WriteLine Right("    " & CStr(lInCounter), 4) & " ][ " & Join(aZeile, """")
52.
	End If
53.
Loop
54.
oUnsortiert.Close 'Eingabedatei schließen
55.
oProtokoll.Close 'Protokolldatei schließen
56.
 
57.
'Sortierkriterium feststellen - Billigvariante ;-)
58.
R = MsgBox("Sortierung nach Name (Ja) oder nach URL (Nein)?", vbYesNo)
59.
If R = vbYes Then
60.
	DataList.Sort = "Text"
61.
Else
62.
	DataList.Sort = "URL"	
63.
End If
64.
 
65.
'Zieldatei öffnen; ev bereits vorhandene Datei überschreiben
66.
Set oSortiert = fso.OpenTextFile(sSortiert, ForWriting, True)
67.
'Startwerte für Satzvergleich setzen
68.
sPrevURL = "" 
69.
sPrevText = ""
70.
lCounter = 0 'Zähler für geschriebene Sätze
71.
DataList.MoveFirst 'beim ersten Datensatz beginnen ...
72.
Do Until DataList.EOF '... und bis zum letzten durchgehen
73.
	'Unterschied zum vorhergehenden Datensatz?
74.
	If LCase(DataList.Fields.Item("URL")) <> LCase(sPrevURL) Or _
75.
	   LCase(DataList.Fields.Item("Text")) <> LCase(sPrevText) Then
76.
		'keine Übereinstimmung beider Felder mit vorigem Datensatz, daher
77.
		'Ausgabezeile zusammensetzen und schreiben
78.
		oSortiert.WriteLine "<p><a href=""" & _
79.
			DataList.Fields.Item("URL") & _
80.
			""">" & _
81.
			DataList.Fields.Item("Text") & _
82.
			"</a></p>"
83.
		lCounter = lCounter + 1 'Zähler erhöhen
84.
		'letzte geschriebene Daten merken
85.
		sPrevURL = DataList.Fields.Item("URL")
86.
		sPrevText = DataList.Fields.Item("Text")
87.
	End If
88.
	'nächsten Datensatz auswählen
89.
	DataList.MoveNext
90.
Loop
91.
'Ausgabedatei schließen
92.
oSortiert.Close
93.
'Anzahl Datensätze ausgeben
94.
MsgBox Right("____" & CStr(lInCounter), 4) & "__ Datensätze eingelesen " & vbCrLF & _
95.
	   Right("____" & CStr(lInCounter - DataList.RecordCount), 4) & "__ fehlerhafte Zeilen entfernt " & vbCrLF & vbCrLF & _
96.
	   Right("____" & CStr(lCounter), 4) & "__ Datensätze im Ergebnis " & vbCrLF & _
97.
	   Right("____" & CStr(DataList.RecordCount - lCounter), 4) & "__ Duplikatzeilen entfernt ", _
98.
	   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
Bitte warten ..
Mitglied: Fraenky
28.08.2007 um 10:20 Uhr
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
Bitte warten ..
Mitglied: bastla
28.08.2007 um 12:54 Uhr
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
Bitte warten ..
Mitglied: Fraenky
28.08.2007 um 14:26 Uhr
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:
01.
If Right(RTrim(sZeile), 1) <> ">" Then 'Zeile endet nicht mit ">", vermutlich umgebrochen
02.
			oProtokollKorrektur.WriteLine Right("    " & CStr(lInCounter), 4) & " ## " & sZeile 'im Protokoll festhalten
03.
			sNZeile = oUnKorrigiert.ReadLine 'Nächste Zeile einlesen
04.
			lInCounter = lIncounter + 1
05.
			If Left(LTrim(sNZeile), 1) <> "<" Then 'Zeile beginnt nicht mit "<", vermutlich Fortsetzung
06.
				sZeile = RTrim(sZeile) & " " & LTrim(sNZeile) 'Zeilen verbinden; zwischen beiden Teilen nur eine Leerstelle zulassen
07.
			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
Bitte warten ..
Mitglied: bastla
28.08.2007 um 15:38 Uhr
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
01.
'Zieldatei öffnen; ev bereits vorhandene Datei überschreiben
02.
Set oSortiert = fso.OpenTextFile(sSortiert, ForWriting, True)
könntest Du noch ein
01.
Set oProtokollDuplikate = fso.OpenTextFile(sProtokollDuplikate, ForWriting, True)
setzen, was natürlich bedingt, dass am Anfang des Scripts eine Zeile für den Pfad hinzukommt:
01.
sProtokollDuplikate = "C:\skript\Liste_sort\ProtokollDuplikate.txt"   'Protokoll für doppelte Sätze
Analog zum Öffnen ist dann auch ein
01.
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)
01.
				oProtokollDuplikate.WriteLine "zu " & Right("    " & CStr(lCounter), 4) & ": " & _
02.
						"<p><a href=""" & _
03.
						DataList.Fields.Item("URL") & _
04.
						""">" & _
05.
						DataList.Fields.Item("Text") & _
06.
						"</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
Bitte warten ..
Mitglied: Fraenky
28.08.2007 um 17:36 Uhr
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.
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:

01.
sUnsortiert = "C:\skript2\Liste_sort\liste.txt"    'Quelldatei
02.
sSortiert = "C:\skript2\Liste_sort\Sortiert.txt"   'Zieldatei
03.
sProtokoll = "C:\skript2\Liste_sort\Protokoll.txt" 'Protokoll für nicht verarbeitete Sätze
04.
sProtokollDuplikate = "C:\skript2\Liste_sort\ProtokollDuplikate.txt"   'Protokoll für doppelte Sätze
05.
 
06.
Const ForReading = 1, ForWriting = 2, ForAppending = 8 'Öffnungsarten für Textdateien
07.
Set fso = CreateObject("Scripting.FileSystemObject") 'für Dateisystemzugriffe
08.
 
09.
'für die Definition der Datenfelder (siehe verlinkter Artikel)
10.
Const adVarChar = 200
11.
Const MaxCharacters = 255
12.
Const adFldIsNullable = 32
13.
 
14.
Set DataList = CreateObject("ADOR.Recordset") 'Datenbankobjekt erstellen
15.
DataList.Fields.Append "URL", adVarChar, MaxCharacters, adFldIsNullable  'Feld "URL" definieren
16.
DataList.Fields.Append "Text", adVarChar, MaxCharacters, adFldIsNullable 'Feld "Text" definieren
17.
DataList.Open
18.
 
19.
Set oUnsortiert = fso.OpenTextFile(sUnsortiert, ForReading) 'Unsortierte Datei zum Lesen öffnen
20.
Set oProtokoll = fso.OpenTextFile(sProtokoll, ForWriting, True) 'Protokolldatei zum Schreiben öffnen; altes Protokoll überschreiben
21.
lInCounter = 0
22.
Do While Not oUnSortiert.AtEndOfStream 'Schleife bis zum Dateiende
23.
	aZeile = Split(oUnsortiert.ReadLine, """") 'Zeile einlesen und an den Anführungszeichen zerteilen
24.
	lInCounter = lIncounter + 1
25.
	If UBound(aZeile) = 2 Then '2 Anführungszeichen gefunden - 3 Teile:
26.
		'1. Teil = aZeile(0): alles vor URL (vor dem ersten Anführungszeichen)
27.
		'2. Teil = aZeile(1): URL (gefunden zwischen Anführungszeichen)
28.
		'3. Teil = aZeile(2): alles nach URL (nach dem zweiten Anführungszeichen)
29.
 
30.
		'Zerlegung des 3. Teiles:
31.
		If InStr(aZeile(2), "<") < 2 Then 'fehlerhafter Link-Text
32.
			oProtokoll.WriteLine Right("    " & CStr(lInCounter), 4) & " -- " & Join(aZeile, """")
33.
		Else
34.
			sText = Left(aZeile(2), InStr(aZeile(2), "<") - 1) 'bis zum ersten "<"
35.
			sText = Mid(sText, InStrRev(sText, ">") + 1) 'ab dem letzten ">"
36.
			If aZeile(1) <> "" Or sText <> "" Then
37.
				DataList.AddNew 'neuen Datensatz erstellen
38.
				DataList("URL") = aZeile(1) 'Feld "URL" befüllen
39.
				DataList("Text") = sText    'Feld "Text" befüllen 
40.
				DataList.Update '...  und Datensatz eintragen 
41.
			Else
42.
				'Eintrag in das Protokoll:
43.
					'Alle Teile zusammenfassen,
44.
					'dabei die entfernten Anführungszeichen wieder einfügen und
45.
					'Zeile in Protokolldatei schreiben
46.
				oProtokoll.WriteLine Right("    " & CStr(lInCounter), 4) & " __ " & Join(aZeile, """")
47.
			End If
48.
		End If
49.
	Else
50.
		'anderer Zeilenaufbau - wäre näher zu untersuchen
51.
		'zumindest Protokolleintrag erstellen
52.
		oProtokoll.WriteLine Right("    " & CStr(lInCounter), 4) & " ][ " & Join(aZeile, """")
53.
	End If
54.
Loop
55.
oUnsortiert.Close 'Eingabedatei schließen
56.
oProtokoll.Close 'Protokolldatei schließen
57.
 
58.
'Sortierkriterium feststellen - Billigvariante ;-)
59.
R = MsgBox("Sortierung nach Name (Ja) oder nach URL (Nein)?", vbYesNo)
60.
If R = vbYes Then
61.
	DataList.Sort = "Text"
62.
Else
63.
	DataList.Sort = "URL"	
64.
End If
65.
 
66.
Set oProtokollDuplikate = fso.OpenTextFile(sProtokollDuplikate, ForWriting, True)
67.
'Zieldatei öffnen; ev bereits vorhandene Datei überschreiben
68.
Set oSortiert = fso.OpenTextFile(sSortiert, ForWriting, True)
69.
'Startwerte für Satzvergleich setzen
70.
sPrevURL = "" 
71.
sPrevText = ""
72.
lCounter = 0 'Zähler für geschriebene Sätze
73.
DataList.MoveFirst 'beim ersten Datensatz beginnen ...
74.
Do Until DataList.EOF '... und bis zum letzten durchgehen
75.
	'Unterschied zum vorhergehenden Datensatz?
76.
	If LCase(DataList.Fields.Item("URL")) <> LCase(sPrevURL) Or _
77.
	   LCase(DataList.Fields.Item("Text")) <> LCase(sPrevText) Then
78.
		'keine Übereinstimmung beider Felder mit vorigem Datensatz, daher
79.
		'Ausgabezeile zusammensetzen und schreiben
80.
		oSortiert.WriteLine "<p><a href=""" & _
81.
			DataList.Fields.Item("URL") & _
82.
			""">" & _
83.
			DataList.Fields.Item("Text") & _
84.
			"</a></p>"
85.
		lCounter = lCounter + 1 'Zähler erhöhen
86.
		'letzte geschriebene Daten merken
87.
		sPrevURL = DataList.Fields.Item("URL")
88.
		sPrevText = DataList.Fields.Item("Text")
89.
		Else 
90.
		oProtokollDuplikate.WriteLine "zu " & Right("    " & CStr(lCounter), 4) & ": " & _
91.
						"<p><a href=""" & _
92.
						DataList.Fields.Item("URL") & _
93.
						""">" & _
94.
						DataList.Fields.Item("Text") & _
95.
						"</a></p>"
96.
 
97.
	End If
98.
	'nächsten Datensatz auswählen
99.
	DataList.MoveNext
100.
Loop
101.
'Ausgabedatei schließen
102.
oSortiert.Close
103.
'ProtokollDuplikateDatei schließen
104.
oProtokollDuplikate.Close
105.
'Anzahl Datensätze ausgeben
106.
MsgBox Right("____" & CStr(lInCounter), 4) & "__ Datensätze eingelesen " & vbCrLF & _
107.
	   Right("____" & CStr(lInCounter - DataList.RecordCount), 4) & "__ fehlerhafte Zeilen entfernt " & vbCrLF & vbCrLF & _
108.
	   Right("____" & CStr(lCounter), 4) & "__ Datensätze im Ergebnis " & vbCrLF & _
109.
	   Right("____" & CStr(DataList.RecordCount - lCounter), 4) & "__ Duplikatzeilen entfernt ", _
110.
	   vbOK, "Statistik"
Danke für Deine Geduld, Dein Engagement, Deine Sachkunde, Deine Freundlichkeit, und und und.
Gruß
Fränky
Bitte warten ..
Mitglied: bastla
28.08.2007 um 19:48 Uhr
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
Bitte warten ..
Mitglied: Fraenky
28.08.2007 um 21:29 Uhr
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
Bitte warten ..
Mitglied: Biber
28.08.2007 um 22:10 Uhr
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
Bitte warten ..
Ähnliche Inhalte
VB for Applications

VB-Script in VB-Script starten und Parameter übergeben

gelöst Frage von denkisVB for Applications7 Kommentare

Hallo liebe Scriptgemeinde, ich muss mehrere Rechner für den Übergang in eine neue Domäne vorbereiten. Dafür sind drei wesentliche ...

VB for Applications

VB-Script per Aufgabenplanung

gelöst Frage von S4kar97VB for Applications2 Kommentare

Hallo, Ich habe mir ein VB-Script erstellt, welches im Grunde ein Programm startet und diesem Parameter übergibt und die ...

Entwicklung

VB Script Drucker hinzufügen

Frage von Marcel1989Entwicklung3 Kommentare

Funktionsweise sollte definitiv sein das mit einem Script sich 2 verschiedene Betriebssysteme ein und denselben Drucker holen. Mein Script ...

Batch & Shell

VB Script ändert Dateinamen

gelöst Frage von mschaedler1982Batch & Shell5 Kommentare

Hallo zusammen. Kurze Erläuterung zu diesem Thema. Eine Maschine legt jeden Tag zu einer bestimmten Uhrzeit sehr sehr viele ...

Neue Wissensbeiträge
Humor (lol)
Administrator.de Perlen
Tipp von DerWindowsFreak2 vor 3 TagenHumor (lol)6 Kommentare

Hallo, Heute beim stöbern auf dieser Seite bin auf folgenden Thread aus dem Jahre 2006 gestossen: Was meint ihr? ...

Erkennung und -Abwehr
OpenSSH-Backdoor Malware erkennen
Tipp von Frank vor 3 TagenErkennung und -Abwehr

Sicherheitsforscher von Eset haben 21 Malware-Familien untersucht. Die Malware soll Hintertüren via OpenSSH bereitstellen, so dass Angreifer Fernzugriff auf ...

iOS
WatchChat für Whatsapp
Tipp von Criemo vor 7 TageniOS5 Kommentare

Ziemlich coole App für WhatsApp User in Verbindung mit der Apple Watch. Gibts für iOS sowohl als auch für ...

iOS
IOS hat nen Cursor!
Tipp von Criemo vor 7 TageniOS5 Kommentare

Nette Funktion im iOS. iPhone-Mauszeiger aktivieren „Nichts ist nerviger, als bei einem Tippfehler zu versuchen, den iOS-Cursor an die ...

Heiß diskutierte Inhalte
Grafikkarten & Monitore
PCIe 1.0 Grafikkarte für 3840x2160
Frage von Windows10GegnerGrafikkarten & Monitore30 Kommentare

Hallo, mein Vater hat einen neuen Monitor gekauft, welcher eine native Auflösung von 3840*2160 hat. Diese muss jetzt auch ...

Windows Server
Dienstnamen und oder Deutsche und Englische Beschreibung in services.msc gleichzeitig anzeigen
gelöst Frage von vafk18Windows Server23 Kommentare

Guten Morgen, die Suche nach Diensten in services.msc gestaltet sich immer wieder schwierig, weil mir je nach Aufgabe die ...

Windows Server
Kleine Umfrage: Windows Server Desktop oder Core?
Frage von doomfreakWindows Server15 Kommentare

Hey :) Ich wollte mal eine kleine Umfrage hier starten. Ich bin schon etwas länger auf dieser Seite hier ...

JavaScript
Javascript: WebSql
gelöst Frage von internet2107JavaScript15 Kommentare

Guten Morgen zusammen, zunächst einmal einen schönen dritten Advent. Ich habe ein Problem mit Javascript und WebSQL. Bisher habe ...