Seite 1 von 1
String, Jahreszahl herausfiltern [gelöst]
Verfasst: Mo, 07.03.2011 08:21
von clag
Hallo Kenner und Könner,
in einem String von bis zu 100 Zeichen Länge ist an beliebiger Stelle eine 4 stellige Jahres enthalten,
wie kann die Position bzw die Zahl selbst heraus filtern?
Meine Versuche mit regulären Ausdrücken sind gescheitert bzw bringen Fehlermeldungen
Code: Alles auswählen
dasJahr=FindPartString(oTcursor.string, [0-9]{4},"",1)
Wie muss ich das in Basic korrekt ausdrücken?
Re: String, Jahreszahl heraus filtern
Verfasst: Mo, 07.03.2011 08:30
von komma4
Die in TOOLS>STRINGS mitgelieferte Funktion FINDPARTSTRING erwartet drei Zeichenketten und ein Integer.
Du rufst sie mit einem regulären Ausdruck auf... das geht nicht.
Verwende einen SEARCHDESCRIPTOR - der kann mit regulären Ausdrücken umgehen.
Re: String, Jahreszahl heraus filtern
Verfasst: Mo, 07.03.2011 11:31
von Stephan
wie kann die Position bzw die Zahl selbst heraus filtern?
Indem Du durch den Sring interierst, z.B.:
Code: Alles auswählen
Function FindeJahr_Zahl(x As String)
For i = 1 To LEN(x)
tmp1 = Left(x, i)
tmp2 = Right(tmp1, 1)
Select Case ASC(tmp2)
Case 48 To 58
tmp3 = tmp3 & tmp2
If LEN(tmp3) = 4 Then
FindeJahr_Zahl = tmp3
Exit Function
End If
Case Else
tmp3 = ""
End Select
Next i
End Function
Code: Alles auswählen
Function FindeJahr_Position(x As String)
For i = 1 To LEN(x)
tmp1 = Left(x, i)
tmp2 = Right(tmp1, 1)
Select Case ASC(tmp2)
Case 48 To 58
tmp3 = tmp3 & tmp2
If LEN(tmp3) = 4 Then
FindeJahr_Position = i-4
Exit Function
End If
Case Else
tmp3 = ""
End Select
Next i
End Function
Wie muss ich das in Basic korrekt ausdrücken?
Ich denke das geht garnicht, denn in der Funktion steht ja:
' Finds a PartString, that is framed by the Strings 'Prestring' and 'PostString'
Function FindPartString(BigString, PreString, PostString as String, SearchPos as Integer) as String
und mir ist nicht klar oher Du PreString und PostString wüßtest ´(zumindest sagst Du nichts darüber), denn das sind meines Erachtens die Strings die den gesuchten Teilstring (hier also die Jahreszahl) einschließen -->siehe Funktionsbeschreibung.
Gruß
Stephan
Re: String, Jahreszahl heraus filtern
Verfasst: Mo, 07.03.2011 13:07
von clag
Hallo Ihr,
Danke für eure Hilfe und Vorschläge die muss ich erst einmal verinnerlichen.....
da es sich um recht aktuelle Jahreszahlen handelt habe ich mir meiner "Not"
mit InStr() in einer Schleife 1800-Heute geholfen, bei zB "0100" funktioniert das natürlich nicht mehr
Code: Alles auswählen
dim yx as integer
dim yfin as integer
yx = 1800
yfin = year(now)+2
while yx < yfin
yx = yx +1
yposition = InStr(oTcursor.string,yx)
if yposition >0 then goto jumpout
wend
print "loop ausstieg"
jumpout:
print yx & yposition
Stephan hat geschrieben:und mir ist nicht klar oher Du PreString und PostString wüßtest ´(zumindest sagst Du nichts darüber), denn das sind meines Erachtens die Strings die den gesuchten Teilstring (hier also die Jahreszahl) einschließen -->siehe Funktionsbeschreibung.
ja genau das ist die Schwierigkeit, es ist praktisch nichts vom String bekannt, außer die Vermutung auf eine 4 stellige Zahl.
ich hatte gehofft, so den Teilstring ab bzw bis zu der ersten beliebigen 4 stelligen Zahl zu erhalten
1. als Bestätigung für das Vorkommen und 2. als Positionsangabe.
Das war aber auch nur so nen Schuss ins blaue, weil da fehlt mir leider noch sehr viel an Wissen zum OOo-Basic.
Re: String, Jahreszahl heraus filtern
Verfasst: Mo, 07.03.2011 13:53
von komma4
Code: Alles auswählen
Sub de47269
' 2011-03-07
' angepasstes Codestück aus:
' Bibliothek: Template
' Modul: Correspondence
oSearchDesc = ThisComponent.createsearchDescriptor()
With oSearchDesc
.SearchRegularExpression = True
.SearchWords = True
.SearchString = "[0-9]{4}"
End With
oFoundall = ThisComponent.FindAll( oSearchDesc )
For i = 0 To oFoundAll.Count -1
oFound = oFoundAll.GetByIndex(i)
sFoundString = oFound.String
msgbox sFoundString
next i
End Sub
Re: String, Jahreszahl heraus filtern
Verfasst: Di, 08.03.2011 09:19
von clag
Hallo komma4,
Danke für das konkretisierte Beispiel, das hilft mir sehr, es funktioniert hier auch prima
und "spuckt" alle 4 stelligen Zahlen des Dokumenttextes aus.
Was ich aber noch nicht verstehe, wenn es denn überhaupt möglich ist
1. wie muss ich den Code ändern damit ich einen String übergeben kann und nur diesen durchsuche?
2. wie komme ich ohne Schleife für die Fundstellen aus und übernehme direkt den ersten gefundenen Wert?
und schonmal Danke für ?
Re: String, Jahreszahl heraus filtern
Verfasst: Di, 08.03.2011 11:33
von komma4
clag hat geschrieben:1. wie muss ich den Code ändern damit ich einen String übergeben kann und nur diesen durchsuche?
2. wie komme ich ohne Schleife für die Fundstellen aus und übernehme direkt den ersten gefundenen Wert?
1. Das geht mit dem
SearchDescriptor nicht, da er auf den Textteil eines Writer-Dokuments wirkt.
2. siehe Beispiel...
Code: Alles auswählen
Sub de47269_2
' 2011-03-08
oTextString = createUnoService( "com.sun.star.util.TextSearch" )
oSuchOpt = createUnoStruct( "com.sun.star.util.SearchOptions" )
With oSuchOpt
.SearchString = "[0-9]{4}"
.algorithmType = com.sun.star.util.SearchAlgorithms.REGEXP
End With
oTextString.setOptions( oSuchOpt )
sSuchString = "Meine 1 Zeile mit Jahreszahl 2003 - und weiterem Inhalt "
oErgebnis = oTextString.searchForward( sSuchString , 0, Len( sSuchString ) )
If oErgebnis.subRegExpressions = 1 Then
Msgbox "vierstelllige Zahl gefunden, Startoffset: " & _
oErgebnis.StartOffset(0) & _
" Endeoffset: " & _
oErgebnis.EndOffset(0)
Msgbox Mid( sSuchString, oErgebnis.StartOffset(0)+1, 4 )
End If
End Sub
...das Du bestimmt zu einer
FUNCTION umbauen kannst, die einen
STRING annimmt und die Jahreszahl zurück gibt - oder?!
Re: String, Jahreszahl herausfiltern
Verfasst: Mi, 09.03.2011 09:34
von clag
Hallo komma4,
clag hat geschrieben:das Du bestimmt zu einer FUNCTION umbauen kannst,
dein Vertrauen in meine Basic Kenntnisse schmeichelt mir schon, ist aber nicht wirklich berechtigt und erscheint mir eher wie Zweckoptimismus
Also das mit den Funktionen habe ich noch nicht ansatzweise auf dem Schirm
Insgesamt bin ich erstaunt wie kompliziert es sich (für mich) darstellt eine Zahl aus einem Absatz zu fischen von dem nur die Position bekannt ist.
Also mein konkretes Anliegen ist es, die erste 4stellige Zahl im 3.Absatz zu ermitteln, wobei in den Absätzen davor auch solche Zahlen vorkommen können.
diese Antwort
komma4 hat geschrieben:1. Das geht mit dem SearchDescriptor nicht, da er auf den Textteil eines Writer-Dokuments wirkt.
zeigt, einfach nur die erste Zahl im Dok suchen reicht also nicht um zum Ziel zu kommen, man muss doch gezielt in dem 3. Absatz/String suchen.
Damit scheint dein Vorschlag eine solche Funktion zu erstellen an die man einen String übergeben kann die Lösung zu sein.
Wäre super wenn du mir zeigen /erklären könntest wie der Code dazu aussehen müsste.
Re: String, Jahreszahl herausfiltern
Verfasst: Mi, 09.03.2011 12:12
von komma4
Eine Funktion ist "das Gleiche" wie eine SUB, nur dass sie -unter dem Namen der Funktion- einen Wert zurück gibt.
Deine Aufgabe besteht also darin,
- den Text des dritten Paragraphen zu ermitteln,
- diesen an die Funktion zu übergeben,
- mit der Ruckgabe weiter zu arbeiten.
Code: Alles auswählen
Sub de47269_3
' 2011-03-09
' erzeuge Textcursor
oTextCursor = ThisComponent.Text.createTextCursor()
' der steht immer am Anfang des Dokuments!
' gehe zum 2. Paragraphen
oTextCursor.gotoNextParagraph( FALSE )
' gehe zum 3. Paragraphen
oTextCursor.gotoNextParagraph( FALSE )
' expandiere bis zum Ende
oTextCursor.gotoEndOfParagraph( TRUE )
' Zeichenkette des Paragraphen
sString = oTextCursor.getString()
' Funktion aufrufen, Ergebnis anzeigen
msgbox fkt_de47269( sString )
End Sub
Function fkt_de47269( sucheIN as String )
oTextString = createUnoService( "com.sun.star.util.TextSearch" )
oSuchOpt = createUnoStruct( "com.sun.star.util.SearchOptions" )
With oSuchOpt
.SearchString = "[0-9]{4}\ "
.algorithmType = com.sun.star.util.SearchAlgorithms.REGEXP
End With
oTextString.setOptions( oSuchOpt )
oErgebnis = oTextString.searchForward( sucheIN , 0, Len( sucheIN ) )
If oErgebnis.subRegExpressions = 1 Then
fkt_de47269 = Mid( sucheIN, oErgebnis.StartOffset(0)+1, 4 )
Else
fkt_de47269 = "keine 4-stellige Ziffernfolge gefunden"
End If
End Function
Das Beispiel macht es deutlich?
Re: String, Jahreszahl herausfiltern
Verfasst: Mi, 09.03.2011 14:48
von clag
Hallo komma4,
Danke für das deutliche und erklärte Beispiel, das hilft sehr, nun habe ich das auch mit der Funktion so in etwa verstanden,
damit muss ich jetzt mal herum experimentieren.
Diese entstandene suchen/finden Funktion erscheint mir recht universell und auch gut für andere Zwecke geeignet bzw anpassbar.
also nochmal Danke für die geduldige Hilfe
