calim3ro
Goto Top

Unterscheiden zwischen Zahlen und Buchstaben

Hallo zusammen

Ich habe eine Textdatei mit folgendem Inhalt:

Salzburg 123456
1234567 Berlin
2345678 Hamburg
3456789 Wien
4567890 Koeln
Hamburg 2345678

Nun möchte ich von der ersten und letzten Zeile die Position 1-7 als String ausgeben, sofern diese numerisch sind. (prüfung auf reine Zahlenfolge notwendig)

Wie müsste so ein Script in VB aussehen,? Besten Dank für eure Bemühungen schon mal im Voraus.

Bei Fragen einfach nachfragen. face-smile

Gruss Nickpicker

Content-Key: 239913

Url: https://administrator.de/contentid/239913

Ausgedruckt am: 29.03.2024 um 09:03 Uhr

Mitglied: colinardo
colinardo 03.06.2014 aktualisiert um 17:07:04 Uhr
Goto Top
Hallo Nickpicker,
also wenn ich dich richtig verstanden habe etwa so:
'Pfad der Datei  
datei = "c:\DeineDatei.txt"  

Set fso = CreateObject("Scripting.Filesystemobject")  
Set regex = CreateObject("vbscript.regexp")  

'nur Zahlen erlauben  
regex.Pattern = "^\d+$"  

' Textfile in ein Array bestehend aus den einzelnen Zeilen einlesen  
arrLines = Split(fso.OpenTextFile(datei).ReadAll(),vbNewLine,-1,1)

'Teste die erste Zeile der Textdatei  
If regex.Test(Left(arrLines(0),7)) Then
	MsgBox Left(arrLines(0),7)
End If

'Teste die letzte Zeile der Textdatei  
If regex.Test(Left(arrLines(UBound(arrLines)),7)) Then
	MsgBox Left(arrLines(UBound(arrLines)),7)
End If
Grüße Uwe
Mitglied: Calim3ro
Calim3ro 03.06.2014 um 16:39:54 Uhr
Goto Top
Hallo Uwe

Besten Dank für deine schnelle Rückmeldung.
Ich habe dein Skript kopiert und den Pfad zur Datei angepasst. Als String (MsgBox) erhalte ich jedoch jeweils nur "4567890", das erwartete "1234567" bleibt jedoch aus.

Bin leider kein Hirsch in VBS und konnte den Fehler nicht selber finden.
Kannst du dir das nochmal anschauen?

Gruss Nickpicker
Mitglied: colinardo
colinardo 03.06.2014 aktualisiert um 17:04:26 Uhr
Goto Top
Dann ist mir noch nicht klar was du willst, ich bin jetzt davon ausgegangen das wenn in Zeile 1 und der letzten Zeile z.B. anstatt des Wortes Salzburg oder Hamburg dort eine eine Zahlenfolge an der Zeichenposition 1-7 steht diese gemeldet werden soll... Also und diesem Beispiel garnichts ...

Salzburg 123456 < hier steht an Position 1-7 nur Text (keine Meldung)
1234567 Berlin
2345678 Hamburg
3456789 Wien
4567890 Koeln
Hamburg 2345678 < hier steht an Position 1-7 nur Text (keine Meldung)


in diesem Beispiel dann nur die 2345678

Salzburg 123456 < hier steht an Position 1-7 nur Text (keine Meldung)
1234567 Berlin
2345678 Hamburg
3456789 Wien
4567890 Koeln
2345678 blabla < hier steht an Position 1-7 eine Zahlenfolge also melde es

oder habe ich da was missverstanden ?
Mitglied: Calim3ro
Calim3ro 04.06.2014 um 13:55:40 Uhr
Goto Top
Sorry, da habe ich mich wohl etwas unklar ausgedrückt.

Es sollte in jedem Fall zwei Zahlen ausgegeben werden.
Und zwar von der ersten numerischen Zeile (Pos 1-7) und letzte Zeile, welche Position 1-7 aus numerischen Werten bestehen.

Im Beispiel müsse also 1234567 & 4567890 ausgegeben werden, da Salzburg 123456 auf Pos. 1-7 nicht rein numerisch ist.
Somit muss diese Zeile ignoriert werden und zur nächsten Zeile wechseln. Das gleiche von untern her, Hamburg 2345678 ist auf Pos 1-7 nicht numerisch, also sollte Pos. 1-7 der Zeile darüber ausgegeben werden, sofern diese numerisch ist.

Hoffe konnte die Unklarheiten beseitigen.
Gar nicht einfach, sowas zu erklären. face-smile

Besten Dank für deine Hilfe.
Mitglied: colinardo
Lösung colinardo 04.06.2014, aktualisiert am 10.06.2014 um 18:23:22 Uhr
Goto Top
Hoffe konnte die Unklarheiten beseitigen.
Ah OK jetzt alles klar face-smile
dim strWert1, strWert2, regex, fso, arrLines, datei
datei = "c:\DeineDatei.txt"  
Set fso = CreateObject("Scripting.Filesystemobject")  
Set regex = CreateObject("vbscript.regexp")  
regex.Pattern = "^\d+$"  
arrLines = Split(fso.OpenTextFile(datei).ReadAll(),vbNewLine,-1,1)
For i = 0 To UBound(arrLines)
	If regex.Test(Left(arrLines(i),7)) Then
		strWert1 = Left(arrLines(i),7)
		Exit For
	End If
Next
For i = UBound(arrLines) To 0 Step -1
	If regex.Test(Left(arrLines(i),7)) Then
		strWert2 = Left(arrLines(i),7)
		Exit For
	End If
Next
msgbox "Wert1: " & strWert1 & " / Wert2: " & strWert2   
set fso = Nothing
set regex = Nothing
das ganze ließe sich auch noch weiter vereinfachen indem man komplett über ein einzelnes Regex-Pattern und Groupmatches geht (wollte aber das du das obige noch halbwegs verstehst):
dim strWert1, strWert2, regex, fso, content, datei
datei = "c:\DeineDatei.txt"  
Set fso = CreateObject("Scripting.Filesystemobject")  
Set regex = CreateObject("vbscript.regexp")  
regex.Multiline = True
regex.Pattern = "^(\d{7})[\s\S]*^(\d{7})"  
content = fso.OpenTextFile(datei).ReadAll()
Set matches = regex.Execute(content)
If matches.Count > 0 Then
	strWert1 = matches(0).Submatches(0)
        strWert2 = matches(0).Submatches(1)
	MsgBox "Erster Wert: " & strWert1 & vbNewLine & "Zweiter Wert: " & strWert2  
End If
set fso = Nothing
set regex = Nothing
set matches = Nothing
Grüße Uwe
Mitglied: colinardo
Lösung colinardo 10.06.2014 aktualisiert um 18:23:17 Uhr
Goto Top
Wenns das dann war, den Beitrag bitte noch als gelöst markieren, merci.

Grüße Uwe