proggernewbie hat geschrieben:Guten Morgen,
noch zur Erklärung: lese solche Sachen gerne auf dem Tablet oder Handy, wenn ich mit Bus und Bahn unterwegs bin, und da nerven viele Einzeldateien und bringen endlosen Datenmüll mit. Deshalb packe ich gerne so viel wie möglich in eine Datei.
@GlassJoe
vielen Dank für deinen Code und auch für deinen Zuspruch und deine Aufmunterung, aber puh. Das ist schon ziemlich harter Tobak für mich. Und gleich eine fertige Lösung präsentiert zu bekommen, war nicht meine Absicht. Nochmals danke dafür.
Ich hatte beabsichtigt die Position der Fundstellen zu berechnen und dann die Strings in der Länge von Anfang bis Ende aus den Fundstellen zu löschen. Leider saß ich nach Einfügen der Funktion FindString ratlos vor dem PC und wusste wieder einmal nicht weiter. Ist halt nicht so einfach für mich, habe sowieso seit einigen Jahren extreme Konzentrationsschwierigkeiten, und ich komme dann mit der Syntax und auch mit den Parametern nicht so recht klar. Gerade was Funktionen und Prozeduren angeht, stehe ich da ziemlich auf dem Schlauch.
Doch nun zu meinen Fragen:
Ist das Erstellen einer LinkedList notwendig oder ließen sich die gefundenen Positionen auch ohne den Einsatz der LinkedList aus den Quelltexten löschen?
Du zählst die Vorkommnisse von "username" und auch die von <br>. Die beiden CHR34 sind vermutlich die Anführungszeichen, die die beiden Anführungszeichen im Suchstring "username" maskieren. Ich hatte an dieser Stelle vor dem Einsatz von Findstring schon einmal die CHR10 und CHR 13 vor dem "username" eingesetzt, weil ich damit einen Zeilenumbruch erzwingen wollte. Hätte es mir erleichtert, die vorhirigen Strings am Ende der darüber stehenden Zeile abzuschneiden bzw zu löschen. Die Breaks <br> hatte ich nicht als Suchkriterium einbezogen, weil sie auch zwischen den einzelnen Abschnitten mal erscheinen, sondern meinen Suchstring genau vom Anfang dieser sich mit geänderten Seitenzahlen wiederholenden Auflistung versucht die Position zu ermitteln.
Weiter hatte ich überlegt einen Zeilenumbruch durch Suchen und Ersetzen im PB-Editor einzufügen (oder mit AOO Writer). Aber leider wurden keine Zeilenumbrüche eingefügt, oder wenn ich CHR(10)+CHR(13) eingefügt hatte nicht interpretiert, sondern waren im Seitentext dann lesbar. Wie könnte ich mittels Zeilenumbrüchen vor dem "username" den Kommentarbereich von den vorangehenden HTML-Tags trennen, damit mir ein leichteres Löschen möglich ist?
@ GlassJoe, @ H. Brill
Hatte mich auch schon einmal mit Regulären Ausdrücken beschäftigt, aber das ist mir viel zu hoch. Sobald ein String mehr Zeichen als drei enthält, und diese sich auch noch in Zahlen und Buchstaben aufteilen, muss ich kapitulieren. Habe dazu schon sehr viel auf einer Seite im Internet nach regex's gelesen und auch welche in der Eingabemaske "bauen" lassen. Leider geht da snicht bei diesen endlosen Strings.
Habe nur noch eine Frage zur Zeichenkodierung:
Nach dem Öffnen der Quelltexte im Editor (PB-Editor, Notepad usw werden Zeichen nur sehr komisch angezeigt. Habe dazu einen Screenshot gemacht. Weiß nur nicht, wie ich ihn hier ins Forum bekomme. Beim Anzeigen im Debugger stimmt unsere westdeutsche Textkodierung und ich kann problemlos alles lesen, wie müsste ich die Quelldateien öffnen und codieren, damit die Zeichen auch im Browser richtig angezeigt werden?
Erst einmal vielen Dank, muss mich etwas tiefer in den Code einlesen, um da wirklich durchzusteigen und werde mich bei Fragen noch einmal melden.
Schönen Tag noch.
Alfons
Ich wäre schon glücklich, wenn ich wenigstens mit den Stringfunktionen so weit fertig würde, dass ich wüsste, wann welche Parameter einzusetzen sind.
Es gibt immer zig wege sowas zu machen
(wie du an all den geposteten Beispielen sehen kannst, geht es auch viel kürzer, deine Idee immer am <br> mittels chr(13) splitten zu lassen ist z.b eine davon)
Eine Linkedlist ist dabei nicht notwendig (hatte nur zuerst mit einer structurierten linked list mit 2 feldern angefangen, in der dann die zeile aus feld 1 gefiltert und das Resulat in feld 2 geschrieben wird, was auch ging ! aber es gab danach ein extrem unlogisches verhalten, wo der Inhalt der grade noch in Feld2 drin war, ausserhalb der Schleife einfach verloren ging. Hab debugged und probiert ohne Ende wo das Problem war, und konnte in 30-45 Min kein Problem und keine Lösung finden, sowas hab ich in 12 Jahren noch nicht erlebt ! also hab ich eine normale Linked List draus gemacht, und gleich die Ausgabe Linie in die Datei schreiben lassen)
nur mach ich sowas sehr gerne und pack es dann in eine Procedure weil das ein paar Vorteile hat.
1) Ich kann immer wieder das selbe Variablen Namen Schema benutzen (muss mich also nicht mit EnableExplicit rumschlagen) da alles in Proceduren ist. Kann also meine Standard Namen für Strings,Zähler und Positionen verwenden (tmp_p -> temporäre Position, tmp_c -> temporärer Zähler, tmp_str1$ -> temporärer String1)
Bei mir hat jede Variable die sich innerhalb einer Procedure abspielt ein tmp_ davor stehen, und alles was ausserhalb ist, entweder ein Global_ oder ein Main_ davor, und dann auch eine lange und ausführliche Bezeichnung. Weil da ist es wirklich wichtig drauf zu achten.
2) Du lernst die Linked List Funktion kennen
3) Die Linked List ist beim Parsen von Vorteil wenn etwas in einer Schleife mit vielen durchgängen läuft, weil mann so besser im Debugger Kontrollieren kann wo etwas in einer Ausgabe Datei landen würde, an welcher Zeilen Position, Debug an den richtigen Stellen zu setzen fällt leichter. Mann kann genau feststellen wo das Problem ist. Ist es bevor, oder nachdem ich eingelesen habe ? Und mann kann Zeilen abhängig von Suchtreffern hoch und runter springen lassen
EDIT: Hier ein Code den ich vor einem Jahr oder so für mich selbst geschrieben hab, es sind 4 String Parse Funktionen die ich öfter mal gebraucht hab.
Code: Alles auswählen
Procedure.s CutOutText(InputText$,StartText$,StopText$,StartPos,StopPos,SearchMode,StartPosWhenXOccurrences)
InputTextLen = Len(InputText$)
If InputTextLen = 0
ProcedureReturn
EndIf
If SearchMode = 0 ;/ Search StartText$ from StartPos and use StopText$
Debug "MODE=0"
;[/ WORK !
StartTextLen = Len(StartText$)
StopTextLen = Len(StopText$)
If StartTextLen = 0
ProcedureReturn
EndIf
If StopTextLen = 0
ProcedureReturn
EndIf
If StartPos = 0
ProcedureReturn
EndIf
If StartPos >= InputTextLen
ProcedureReturn
EndIf
StartTextFoundPos = FindString(InputText$,StartText$,StartPos)
If StartTextFoundPos
Debug "?1"
Debug StartTextFoundPos
Debug StartTextFoundPos + StartTextLen
StopTextFoundPos = FindString(InputText$,StopText$,StartTextFoundPos + StartTextLen)
If StopTextFoundPos
Debug "?2"
Debug StopTextFoundPos
ExtractedText$ = Mid(InputText$,StartTextFoundPos+StartTextLen,StopTextFoundPos - StartTextFoundPos - StartTextLen)
If ExtractedText$
ProcedureReturn ExtractedText$
EndIf
EndIf
EndIf
;]
ElseIf SearchMode = 1 ;/ Search StartText$ from StartPos and use Stop Pos
Debug "MODE=1"
;[/ WORK !
StartTextLen = Len(StartText$)
If StartTextLen = 0
ProcedureReturn
EndIf
If StartPos = 0
ProcedureReturn
EndIf
If StartPos >= StopPos
ProcedureReturn
EndIf
StartTextFoundPos = FindString(InputText$,StartText$,StartPos)
If StartTextFoundPos
Debug "?1"
Debug StartTextFoundPos
Debug StartTextFoundPos + StartTextLen
ExtractedText$ = Mid(InputText$,StartTextFoundPos,StopPos - StartTextFoundPos)
ExtractedText$ = Right(ExtractedText$,Len(ExtractedText$) - StartTextLen)
If ExtractedText$
ProcedureReturn ExtractedText$
EndIf
EndIf
;]
ElseIf SearchMode = 2 ;/ Set Search StartPos when StartText$ is found the X nd Time then search until StopText$
Debug "MODE=2"
;[/ WORK !
StartTextLen = Len(StartText$) : StopTextLen = Len(StopText$)
If StartPosWhenXOccurrences = 0
ProcedureReturn
EndIf
If StartTextLen = 0
ProcedureReturn
EndIf
If StopTextLen = 0
ProcedureReturn
EndIf
If CountString(InputText$,StartText$) < StartPosWhenXOccurrences
ProcedureReturn
EndIf
Repeat
TempPosition = FindString(InputText$,StartText$,TempPosition+1)
If TempPosition
FoundXTimes + 1
If FoundXTimes = StartPosWhenXOccurrences
StartPos = TempPosition + 1
If StartPos >= InputTextLen
ProcedureReturn
EndIf
Break
EndIf
EndIf
ForEver
Debug "START"
Debug StartPos
StopTextFoundPos = FindString(InputText$,StopText$,StartPos)
If StopTextFoundPos
Debug "?2"
Debug StopTextFoundPos
ExtractedText$ = Mid(InputText$,StartPos,StopTextFoundPos - StartPos)
If ExtractedText$
ProcedureReturn ExtractedText$
EndIf
EndIf
;]
ElseIf SearchMode = 3 ;/ Set Search StartPos when StartText$ is found the X nd Time then search until StopPos
Debug "MODE=3"
;[/ WORK !
StartTextLen = Len(StartText$)
If StartPosWhenXOccurrences = 0
ProcedureReturn
EndIf
If StartTextLen = 0
ProcedureReturn
EndIf
If StopPos = 0
ProcedureReturn
EndIf
If CountString(InputText$,StartText$) < StartPosWhenXOccurrences
ProcedureReturn
EndIf
Repeat
TempPosition = FindString(InputText$,StartText$,TempPosition+1)
If TempPosition
FoundXTimes + 1
If FoundXTimes = StartPosWhenXOccurrences
StartPos = TempPosition + 1
If StartPos >= InputTextLen
ProcedureReturn
EndIf
If StartPos >= StopPos
ProcedureReturn
EndIf
Break
EndIf
EndIf
ForEver
Debug "START"
Debug StartPos
ExtractedText$ = Mid(InputText$,StartPos,StopPos - StartPos)
If ExtractedText$
ProcedureReturn ExtractedText$
EndIf
;]
EndIf
EndProcedure
;/ DEN STRING EINE ZEILE WEITER UNTEN IN EINE DATEI SCHMEISSEN UND DANN TESTEN
;/ <li>-- <a href="/dvd/31941.html" title="Bella is on Mad Sex Party - Lesbo Overload & The Cock Massage"><strong>Mad Sex Party - Lesbo Overload & The<br />
;/ ES SOLLTE DANN BEI ALLEN MODES IMMER DER STRING EINE ZEILE WEITER UNTEN RAUSKOMMEN
;/ ="Bella is on Mad Sex Party - L
If ReadFile(0,"C:\aaaa.txt")
While Eof(0) = 0
bla$ = ReadString(0)
Debug CutOutText(bla$,"title","esbo",31,#False,0,#False)
Debug "TRY NEXT MODE"
Debug CutOutText(bla$,"title","",32,70,1,#False)
Debug "TRY NEXT MODE"
Debug CutOutText(bla$,"title","",#False,#False,2,2)
Debug "TRY NEXT MODE"
Debug CutOutText(bla$,"title","",#False,70,3,2)
Wend
CloseFile(0)
EndIf
Und ja der Beispiel String ist der Titel von einem Porn
Es ist wichtig das du den PB Editor ordentlich anpasst, wenn du Probleme mit dem verstehen von Code hast.
Ich rate dir die Einrücklinien zu aktivieren (die haben mir sehr geholfen, ich hatte die selben Probleme wie du)
dazu die Färbung.
So sieht der Editor (ist nicht der Originale, aber der ist auch gut....ausser bei mir, da spinnt der rum) bei mir aus.
http://postimg.org/image/fbuff2x55/
Nicht wundern warum ich ;[ und ;[/ im Code habe ! Der Editor den ich benutze hat standardmässig auch ;[
zum Code falten statt nur ;{ und Falten lassen sich auch kräftig markieren & kommentieren mittels ;[/