String, Jahreszahl herausfiltern [gelöst]

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: String, Jahreszahl herausfiltern [gelöst]

Re: String, Jahreszahl herausfiltern

von clag » Mi, 09.03.2011 14:48

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

Re: String, Jahreszahl herausfiltern

von komma4 » Mi, 09.03.2011 12:12

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?

Re: String, Jahreszahl herausfiltern

von clag » Mi, 09.03.2011 09:34

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.

Re: String, Jahreszahl heraus filtern

von komma4 » Di, 08.03.2011 11:33

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 heraus filtern

von clag » Di, 08.03.2011 09:19

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

von komma4 » Mo, 07.03.2011 13:53

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

von clag » Mo, 07.03.2011 13:07

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

von Stephan » Mo, 07.03.2011 11:31

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

von komma4 » Mo, 07.03.2011 08:30

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.

String, Jahreszahl herausfiltern [gelöst]

von clag » Mo, 07.03.2011 08:21

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?

Nach oben