String, Jahreszahl herausfiltern [gelöst]

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

String, Jahreszahl herausfiltern [gelöst]

Beitrag 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?
Zuletzt geändert von clag am Mi, 09.03.2011 14:49, insgesamt 2-mal geändert.
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: String, Jahreszahl heraus filtern

Beitrag 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.
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: String, Jahreszahl heraus filtern

Beitrag 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
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: String, Jahreszahl heraus filtern

Beitrag 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.
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: String, Jahreszahl heraus filtern

Beitrag 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
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: String, Jahreszahl heraus filtern

Beitrag 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 ?
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: String, Jahreszahl heraus filtern

Beitrag 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?!
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: String, Jahreszahl herausfiltern

Beitrag 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 :lol:
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.
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: String, Jahreszahl herausfiltern

Beitrag 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,

  1. 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?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: String, Jahreszahl herausfiltern

Beitrag 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 :D
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Antworten