Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1624to1628
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Zeichenfolgen in Datei suchen

Zeichenfolgen in Datei suchen
22.05.2018 16:20:58
Sebastian
Hi,
ich hab folgendes vor:
Ich möchte eine ASCII Datei einlesen (ca. 20000 Zeilen) und darin nach bestimmten Zeichenfolgen suchen. Im Grunde sind es immer die selben Zeichen, aber eben sehr viele die theoretisch vorkommen können. Mein Ansatz war es mit der like Funktion su suchen. Ich bekomme aber auch seltsamerweise Ergebnisse die nicht ganz passen. Mein Ansatz war folgender:
(Das File habe ich vorher in das Array geladen)

Function FindString(strCheck, strMatch) As String
Dim i As Long: i = Len(strCheck)
'    On Error Resume Next
Do While Left(strCheck, i) Like strMatch
LenFoundString = Left(strCheck, i)
'       Debug.Print i, Left(strCheck, i), strCheck
i = i - 1
Exit Do
Loop
End Function


sub StartSuche
dim i as long
For i = 1 To UBound(arr)
debug.print FindString(arr(i), "*m[0-999]*")
Next i

Die 2. Suche wäre dann nach "*m[0-999]=[0-999]*"
Was ich am Ende haben möchte ist, dass ich alle Zeichenfolgen die so aussehen, also M0-M999 und M0-999=0-999 habe
(M1, M2, M3, M4, M5 ect)
(M1=1, M1=33, M55=22 ect)
Mein Ergebnis ist aktuell, dass er mir dann die gesamte Zeile ausgibt, da ich die Länge der Suchfunktion nicht weiß (m0 oder M123) und in machen Zeilen der String auch mehrfach vorhanden sein Kann:
"Franz jagt M1 den ganzen M123 Tag durch den Wald m234"

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zeichenfolgen in Datei suchen
22.05.2018 16:32:31
ransi
Hallo Sebastian,
Kannst du mal so eine Textdatei hochladen?
Was soll darin gesucht werden und wie soll die Ausgabe erfolgen?
ransi
AW: Zeichenfolgen in Datei suchen
22.05.2018 17:14:09
Daniel
Hi
wenn du jeden einzelnen Wert von M0 bis M999 zählen willst, musst du diese auch einzeln zählen!
das Problem, dass "M1" nicht nur "M1" sondern auch "M10", "M11" usw zählt, kannst du dadurch lösen, dass du die Leerzeichen zwischen den Worten mit dazunimmst, dh du zählst nicht "M1", sondern " M1 "
allerdings solltest du dann auch beim durchsuchten Text ein Leerzeichen am Anfang und Ende hinzufügen, damit hier keine Sonderfälle entstehen.
probier mal diesen Code.
bei arr = ... musst du eben deine Wertzuweisung ans Array einbauen, ich habe hier nur einen Testarray verwendet:
Sub test()
Dim arr
Dim txt As String
Dim SuchText As String
Dim Erg(0 To 999) As Long
Dim ErgAnzeige(0 To 999, 0 To 1)
Dim i As Long
Dim e As Long
Dim Anz As Long
arr = Array("", "xxx M1 yyyy", "xxx M999 yyy M20")
For i = 1 To UBound(arr)
txt = " " & arr(i) & " "
For e = 0 To 999
SuchText = " M" & e & " "
Anz = (Len(txt) - Len(Replace(txt, SuchText, ""))) / Len(SuchText)
Erg(e) = Erg(e) + Anz
Next
Next
i = 0
For e = LBound(Erg) To UBound(Erg)
If Erg(e) > 0 Then
ErgAnzeige(i, 0) = "M" & e
ErgAnzeige(i, 1) = Erg(e)
i = i + 1
End If
Next
Cells(1, 1).Resize(1000, 2).Value = ErgAnzeige
End Sub
der Code berücksichtigt auch, wenn ein Wert innerhalb der gleichen Zeile mehrfach vorkommt, dieser wird auch mehrfach gezählt.
zu deinem Like:
wenn du M0 - M999 per like abprüfen willst, würde das so aussehen, denn jede Klammer [] steht für genau ein Zeichen (hier mit berücksichigung der Leerzeichen:
xxx like "* M[0-9] *" or xxx like "* M[0-9][0-9] *" or xxx like "* M[0-9][0-9][0-9] *"
oder etwas kürzer, da es auch das # als Platzhalter für Ziffern gibt:
xxx like "* M# *" or xxx like "* M## *" or xxx like "* M### *"
aber damit könntest du dann sowieso nur die Gesamtanzahl ermitteln und nicht jedes M einzeln.
außerdem würde auch jede Zeile nur 1x gezählt, egal wieviele Mx in dieser Zeile vorkommen.
Gruß Daniel
Anzeige
AW: Zeichenfolgen in Datei suchen
23.05.2018 07:43:44
Sebastian
hallo Daniel,
Danke für deinen Lösungsansatz. Ich hab darauf aufgebaut und komme denke so weiter. Das Zählen wäre nicht nötig gewesen, da ich nur wissen muss, welche M### vorhanden sind. Ist aber ein "nice to have" und bleibt im Code :)
Ein Nachteil hat das durchlaufen der Schleife allerdings. Es dauert sehr lange. Hab aktuell Durchlaufzeiten von 30-80 Sekunden. Hatte mir von dem Like erhofft, dass es schneller geht. Aber wie du schon beschrieben hast, ist die Auswertung, welche M### gefunden wurde und auch ob mehrere in einer Zeile sind dadurch nicht oder nur schwer möglich.
Vielen Dank
Anzeige
AW: Zeichenfolgen in Datei suchen
23.05.2018 08:56:11
Matthias
Moin!
Kannst ja auch mal Regex (bei manchen auch Regenechse genannt) probieren. Weiß nicht, ob das schneller ist,läuft aber ohne Schleifen. Im Code unten wird die nur die Anzahl ausgegeben. Für individuelle Treffer, bräuchte man auch eine Schleife.
Sub anzahl()
Dim oRegEx As Object
Dim treffer As Object
Dim quelle As String
quelle = "M2 und M23 und M da fehlt die Zahl aber nicht M23da kein Leerzeichen und nochmal M23  _
M243"
Set oRegEx = CreateObject("vbscript.regexp")
With oRegEx
.Global = True
.IgnoreCase = True
.MultiLine = False
.Pattern = "(M\d+ |M\d+$)"
Set treffer = .Execute(quelle)
End With
MsgBox treffer.Count
End Sub
VG
Anzeige
AW: Zeichenfolgen in Datei suchen
23.05.2018 09:31:26
Daniel
kannst du mal ein Beispiel mit c.a. 10 Zeilen deiner Texte hochladen und zeigen, welches Ergebnis du dafür erwartest?
Gruß Daniel
AW: Zeichenfolgen in Datei suchen
23.05.2018 09:42:18
Sebastian
https://www.herber.de/bbs/user/121757.txt
Hi, hier hab ich einen Teilausschnitt aus so einer Datei.
Das Ergebnis wäre dann wenn ich keinen vergessen habe:

M17
M51
M60
M61
M1=20
M2=97
M2=51
M3=21
M2=50
M4=8
M4=9

AW: Zeichenfolgen in Datei suchen
23.05.2018 10:08:41
Daniel
Hi
dann probiers mal so:

Sub test()
Dim txt As String
Dim T, A
Dim erg As Object
Dim arr
Dim i
Set erg = CreateObject("scripting.dictionary")
arr = hier deine Arrayzuweisung
For Each A In arr
For Each T In Split(A, " ")
T = UCase(T)
If T Like "M#*" Then erg(T) = erg(T) + 1
Next
Next
MsgBox Join(erg.keys, vbLf)
End Sub
die Arrayzuweisung des Textes bitte anpassen.
Gruß Daniel
Anzeige
AW: Zeichenfolgen in Datei suchen
23.05.2018 11:23:12
Sebastian
Wow,
er hat zwar nicht alle gefunden und auch ein paar falsche angezeigt, aber es geht rasend schnell. Welche er da jetzt ausgelassen hat guck ich mir nochmal genauer an.
Danke :)
AW: Zeichenfolgen in Datei suchen
23.05.2018 11:26:16
Sebastian
Ergebnis der ganzen Datei mit dem Beispielteil:
M02
M6"
M30
M17
M60
M1=21
M0
M2=51
M51
M61
M80
M999
M96

AW: Zeichenfolgen in Datei suchen
23.05.2018 12:42:42
Sebastian
Hallo Daniel,
deine Variante funktioniert doch einwandfrei. In der Originaldatei sind zwischen drin ein paar Binärcodes, die er beim Einlesen als Steuerzeichen und Dateiende interpretiert hat. Er hat mir von den 76000 Zeilen lediglich die ersten 14400 eingelesen. Der Teil, den ich hochgeladen hatte, kommt erst später. Entsprechend hat er die M### nicht finden können.
Das Ergebnis kann sich wirklich sehen lassen und ist rasendschnell. Top - besser als erwartet.
Vielen Vielen Dank dafür!
Viele Grüße
Sebastian
Anzeige

307 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige