Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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.

Frage Entwicklung VB for Applications

Mitglied: Fraenky

Fraenky (Level 1) - Jetzt verbinden

23.08.2007, aktualisiert 18.10.2012, 13874 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="http://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 ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Outlook & Mail
gelöst Email Anhänge speichern VB Script aber nur bestimmte Dateitypen (Outlook) (4)

Frage von LindeUnimog zum Thema Outlook & Mail ...

VB for Applications
gelöst VB Script rekursiv statt nur ein Ordner (4)

Frage von Saschaaaaa zum Thema VB for Applications ...

VB for Applications
gelöst VB Script nach gefundenem Wort die nächsten 4 Zeichen ersetzten (2)

Frage von deutsch73 zum Thema VB for Applications ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (19)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (19)

Frage von patz223 zum Thema Windows Userverwaltung ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (15)

Link von Penny.Cilin zum Thema Viren und Trojaner ...