Probleme mit Split()

ronaldo84

Erfahrenes Mitglied
Hallo

ich habe einen Text den splitte ich an vbcrlf. Nun kann es in diesem Text vorkommen, das auch vbcrlf 2 mal hintereinanderkommt. Dann habe ich ja eine leere Zeile in meinem Datenfeld. Diese will ich nun rausfiltern. Dies will ich machen indem ich einfach das aktive Feld durch das nächste ersetzen will.
Code:
subbody = Split(text, vbCrLf)
For i = LBound(subbody) To UBound(subbody)
If (Len(subbody(i)) < 6) Then
    For x = i To (UBound(subbody) - 1)
        subbody(x) = subbody(x + 1)
    Next x
End If
MsgBox (i & ":" & Len(subbody(i)) & ":" & subbody(i))
Next i
Nun gibt er mir aber trotzdem bei der MsgBox noch Zeilen aus die eine länge < 6 haben weiß jemand warum?
 
Hi.

Die MsgBox wird doch immer angezeigt - bei jedem Schleifendurchlauf einmal.

Schreib mal einfach die MsgBox Anweisung in die If Bedingung mit rein.

Wie kommst du eigentlich auf die 6? Wenn du die doppelten vbCrLf rausfiltern willst, kannst du am besten sowas machen:
Code:
do while instr(text, string(2, vbCrLf))
  text = replace(text, string(2, vbCrLf), vbCrLf)
loop
subbody = split(text, vbCrLf)

Gruß
 
Die Msgbox soll ja auch bei jedem Schleifendurchlauf einmal angezeigt werden. So überprüfe ich den Inhalt des Feldes. Das mit dem Replace hatte ich auch gemacht. Ich habe mich dann aber für die Variante mit der 6 entschieden, da auch Zeilen vorkommen indenen eine Zahlenkombination aus 5 Ziffern besteht. Deshalb das mit edr 6. Hatte ich oben nur vergessen zu erwähnen. Die Zahlenkombi ist immer zufällig. Deswegen.
 
ronaldo84 hat gesagt.:
Die Msgbox soll ja auch bei jedem Schleifendurchlauf einmal angezeigt werden. So überprüfe ich den Inhalt des Feldes.
Richtig, da hab ich nicht richtig aufgepasst. Allerdings ist es natürlich so, dass du das momentane Element überprüfst ob dessen Länge < 6 ist und dann (ohne Überprüfung!) die anderen Elemente um eine Position nach "links" schiebst.

Wenn Element i < 6 ist und Element i+1 auch < 6 ist, denn wird das natürlich angezeigt.

Du müßtest wenn ein Element gefunden wurde erstmal das nächste Element suchen was nicht < 6 ist und ab da anfangen zu kopieren.

Außerdem könntest du das noch optimieren indem du nicht immer bis zum letzen Element kopierst.

Gruß
 
Erstmal danke für deine Hilfe.
deepthroat hat gesagt.:
Außerdem könntest du das noch optimieren indem du nicht immer bis zum letzen Element kopierst.
Ist mir schon klar, aber wie sollte ich das den anstellen? Ich würde auch gerne die Reihenfolge beibehalten. Könnte mir natürlich auch so eine Art bubbleshort vorstellen. Oder hast du da etwas anders Im Sinn? Hoffe ja eigentlich das es eine Funktion gibt, die es ermöglicht bestimmte Zeilen aus dem Datenfeld von Split zu löschen. Sowas wie
Code:
delete (subbody(x))
gibt es die? Habe soetwas nicht gefunden.

Gruß
 
Hi.
ronaldo84 hat gesagt.:
Erstmal danke für deine Hilfe.

Ist mir schon klar, aber wie sollte ich das den anstellen?
Ich würde einfach den UBound in einer Variablen vor Betreten der Schleifen speichern und dann wenn du etwas Verschieben mußt die Variable um die Anzahl der Stellen die verschoben wurden dekrementieren.

ronaldo84 hat gesagt.:
Ich würde auch gerne die Reihenfolge beibehalten. Könnte mir natürlich auch so eine Art bubbleshort vorstellen. Oder hast du da etwas anders Im Sinn? Hoffe ja eigentlich das es eine Funktion gibt, die es ermöglicht bestimmte Zeilen aus dem Datenfeld von Split zu löschen. Sowas wie
Code:
delete (subbody(x))
gibt es die? Habe soetwas nicht gefunden.
Nee, sowas gibt es nicht. Aber du kannst ein Array in der Größe ändern und so Elemente am Ende abschneiden.
Code:
Redim Preserve subbody(10)

Wenn ich es mir recht überlege wäre es vermutlich am einfachsten die Elemente die du haben willst gleich in ein anderes Array zu kopieren.
Code:
Dim subbody2() as String
subbody2 = Split("") ' Methode um ein leeres Array zu erstellen: Ubound = -1, LBound = 0

for each x in subbody
  if len(x) >= 6 then
    Redim Preserve subbody2(ubound(subbody2)+1) ' 1 Element anfügen
    subbody2(ubound(subbody2)) = x
  end if
next

Gruß
 
Zurück