Instr zur Überprüfung der Existenz einer Zeichenkette

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

boneshaker

Betreff: Instr zur Überprüfung der Existenz einer Zeichenkette

BeitragFr, Mai 16, 2014 14:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,

in meinem aktuellen Projekt geht es darum, eine Textdatei über ReadLine einzulesen (natürlich Zeile für Zeile) und anschließend wird die Häufigkeit einer bestimmten Zeichenkette errechnet. Das habe ich über den Befehl "Instr" gelöst, allerdings scheint es, dass mit meiner jetzigen Lösung immer nur das erste Exemplar der Zeichenkette in einer Zeile gefunden wird und anschließend weiter zur nächsten Zeile gegangen wird... Ich habe bereits versucht es über den Positions-Parameter von Instr versucht, klappt jedoch leider auch nicht.

Wie kann ich es lösen, dass mehrere gesuchte Zeichenketten in einer Zeile ausgelesen werden?

Hier mein Code:

BlitzBasic: [AUSKLAPPEN]


Local eingabeline$ = ReadLine(TCP_Stream)

Local lastposition% = Instr(eingabeline, "blablabla", lastposition)

If Instr(eingabeline, "<a href=", lastposition) Then
If Not Instr(eingabeline, "blablabla") Then
counter= counter+ 1
lastposition = Instr(eingabeline, "blablabla", lastposition)
EndIf
EndIf



Im Voraus danke und LG.,
boneshaker
 

CO2

ehemals "SirMO"

BeitragFr, Mai 16, 2014 16:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Programmiere momentan nur noch BM, hab da mal ne Funktion geschrieben... BlitzMax: [AUSKLAPPEN]
Function CountOcc:Int(str:String, search:String)
Local count:Int = 0 ' Anzahl gefundener Vorkommen (search in str)
Local start:Int = 1 ' Momentane Startposition (InStr ist 1 basiert)

Repeat
start = Instr(str, search, start) + Len(search) ' start immer wieder verschieben und zwar auf das nächste Vorkommen + die Länge des zu suchenden Strings (sozusagen "hinter" das nächste Vorkommen versetzen)
count = count + 1 ' Jeweils Anzahl inkrementieren
Until start = Len(search) ' Wiederholen, bis start = der Länge entspricht (da InStr 0 zurückgibt, falls kein Vorkommen gefunden wurde, ich oben aber noch die Länge des zu suchenden Strings als startposition für den nächsten durchlauf hinzuaddiere)

Return (count - 1) ' Am Ende die gezählten Vorkommen - 1 returnen (das -1 ist da, weil die Schleife oben auch wenn nichts gefunden wurde, count trotzdem inkrementiert. Deswegen steht in Count immer ein um 1 zu hoher wert...
End Function


Ich glaube dein Fehler ist, dass du InStr nicht in einer Schleife ausführst und deshalb nur immer max. 1 Vorkommen zählst...
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Xeres

Moderator

BeitragFr, Mai 16, 2014 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
@CO2: BlitzMax ist nicht BlitzBasic und darum halte ich es nicht für sinnvoll, den Code im Beginners Corner zu posten.

@boneshaker:

Wenn du die Vorkommen zählen willst, brauchst du eine Schleife die abbricht, wenn Instr eine 0 zurück gibt (also wenn die letzte Position gefunden wurde und der gesuchte String nicht weiter vor kommt).

Je nach dem wie du zählen willst, musst du die Position um 1 bzw. die Länge des gesuchten Strings nach hinten schieben.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

boneshaker

BeitragFr, Mai 16, 2014 20:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab mal versucht, eure Ideen umzusetzen:

BlitzBasic: [AUSKLAPPEN]

Local eingabeline$ = ReadLine(TCP_Stream)

Local pos% = 1

Repeat
pos = Instr(eingabeline, "blablabla", pos) + Len("blablabla")
counter= counter+ 1
Until pos = Len("blablabla")


Leider wird mir wieder eine völlig falsche Zahl ausgegeben.

Sieht jemand meinen Fehler?

LG.,
boneshaker

Xeres

Moderator

BeitragFr, Mai 16, 2014 20:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Until pos = Len("blablabla")

Das stimmt nicht. Da steht: Beende die Schleife, wenn die Position der Länge des Strings entspricht.
Du willst aber aufhören, wenn der String nicht mehr gefunden wurde.
Code: [AUSKLAPPEN]
Until pos =0


Code: [AUSKLAPPEN]
pos = Instr(eingabeline, "blablabla", pos) + Len("blablabla")

Das sieht richtig gedacht aus, macht aber das Falsche. So wird die Position nicht weitergeschoben.
Code: [AUSKLAPPEN]
pos = Instr(eingabeline, "blablabla", pos+Len("blablabla"))
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

boneshaker

BeitragFr, Mai 16, 2014 22:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Super danke, hab es noch kurz optimiert, jetzt funktioniert das perfekt!

hab allerdings ein Problem mit dem TCP-Stream:

Der Stream wird nie fertig geschrieben (in eine .txt-Datei), am Ende fehlen immer ein paar Zeilen.

Ist das ein TCP-Problem?

LG.,
boneshaker

Xeres

Moderator

BeitragFr, Mai 16, 2014 23:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Mir wäre es neu, dass man mit einem TCP Stream überhaupt in eine Datei schreiben könnte. Da wäre OpenFile / WriteLine passender.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group