aus einer Zelle ein Teilstring auslesen

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

Moderator: Moderatoren

Collector
*
Beiträge: 15
Registriert: Sa, 21.01.2006 18:54

aus einer Zelle ein Teilstring auslesen

Beitrag von Collector »

Hi folks

Ich habe noch keine große Erfahrung mit Objekt, APIs, UNO Programierung.

Nun wollte ich gerne wissen, welcher Befehl bzw. Prozedur notwendig ist, aus einer vorhanden Tabelle von einer Zelle ein String auszulesen.

Beispiel: Ich habe eine Spalte (D) wo z.B. 11/61 GB 2, 01/62 D 29, 02/62 USA 2 dieser Text in den einzelnen Zeilen drin steht.

Nun würde ich gerne das jede Zeile in der Spalte nach einer Zeichenkette untersucht wird z.B D 1, wird der String gefunden soll der Wert (in unserem Beispiel die eins) in der selben Zeile 3 Spalten weiter reingeschrieben werden, als nächstes oder vorher wäre noch eine Überprüfung notwendig wenn z.B. in einer Zelle 2 D's enthalten sind z.B. 06/61 USA 8, 12/61 GB 2, 02/62 D 12 , 05/62 I 1, RE 11/75 GB 5, RE 02/76 D 13 soll der niedrigste Wert genommen werden.

Es wäre nett wenn Ihr mich bei meinem Vorhaben unterstützt, es sind 32.000 Zeilen und es ist nicht nur D sondern noch USA; GB; NL; I; F; S; und CH

Ich habe mir (Anfänger) gedacht das man(frau) mit den Befehlen Left; Right; Mid; Len; InStr , eine Abfrageschleife konstruiert oder sowas ähnliches. Lieg ich da in etwa richtig.

Übrigens, die Liste kann man sich bei oldiehitparade.de herunterladen.

Vielen Dank im Voraus

Collector
Die Menschen fangen immer erst mit Fehlern an, bevor sie sich bessern können. (Mengtse)
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Collector,

also, so ganz verstehe ich die Aufgabenstellung noch nicht.
OK, der Zellwert kann ausgelesen werden, dan hast due den String. Den kannst du nun "manipulieren", also z.b. nahc bestimmten Zeichen hin untersuchen.
Nur, nach was willsit du suchen? Nach "D"? nach "D 1" ? Oder nach "D n" , wobei "n" eine beliebige Zahl ist?
Schleifen brauchen feste Start und Zielwerte, zu indest aber Abbruchbedingungen.
Kannst du näher spezifizieren, was genau du suchst?
Und was soll dann in die dritte Spalte geschrieben werden? Nur das "D ?" oder der komplette String?

Also, den Zellinhalt erhälst du über folgende Schleife (für die 30.000 Datensätze..)

Code: Alles auswählen

sub zellinhalt
  oDoc = thisComponent
  oSheet = oDoc.sheets(0)   'erstes Tabellenblatt
  for i = 1 to 30000      '  Zeile 1 bis 30000
       sZellString = oSheet.getCellRangeByName("D" & i).string
       REM Hier kannst du jetzt etwas mit dem Zellinhalt machen
  next
end sub
Es wäre im Übrigen zu prüfen, ob du dein Ergebnis nicht auch direkt mit Formeln hinbekommst. Aber da fehlen mir noch ein paar Infos.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Collector
*
Beiträge: 15
Registriert: Sa, 21.01.2006 18:54

Beitrag von Collector »

Hi Toxitom

Als erstes mal vielen Dank für den Code, damit kann ich schon mal anfangen zu testen.

Sorry, für meine ungenauen Fragen.

Ich möchte in der Spalte "D" jede Zeile nach den Zeichenketten ( D 1; D 2; D 3; ... D 100) untersuchen, wenn in der gesuchten Zeile bzw. Zelle etwas gefunden wurde soll er den Wert (Zahl) drei Spalten weiter reinschreiben.
Dies soll er auch mit den Zeichenketten USA 1; USA 2; ... USA 100 sowie GB n; NL n; usw. tun.

Mein Ziel ist es, in der Liste für jedes Land eine Spalte mit den dazugehörigen Werten zu bekommen. Zur Zeit sind die Werte bzw. Peakplatzierungen der Länder in einer Zelle und auch noch in unterschiedlicher Reihenfolge und noch doppelt.

Doch mit deinem Programmcode ist ein Anfang gemacht.

Achso die Abruchbedingung bzw. Fortführung des Suchprogramms wäre eine leere Zeile.

Da ich OOo Basic lernen möchte, ist die Liste ein schönes Experimentierfeld und gleichzeitig würde es mir bei meiner vorhandenen Sammlung helfen.

Collector
Die Menschen fangen immer erst mit Fehlern an, bevor sie sich bessern können. (Mengtse)
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Collector,

ahh, OK, na gut, das geht wirklich nur mit Makros :-)
Wenn ich das richtig verstanden habe, gibt es deine Codes nur bis 100 (also D 1 bis D 100, etc), dafür aber mit verschiedenen Ländern? Zwischen Land und Zahl steht immer exakt ein Leerzeichen?
Ich nehme jetzt an, dass nur die Codes "D" drei Spalten später eintragen soll, wahrscheinlich USA dann in Spalte 4, NL in 5 u.s.w ?
Eingetragen werden soll nicht "D 1" sondern nur "1", aber als Zahl (Wert)?

Die leere Zelle bestimmt das Ende der Liste?

OK, das wäre alles lösbar - auch wenn ein solches Makro aufgrund der sehr langen Schleifenbedingungen (1-100) (D, USA, NL, GB ...) (Zeile 1- 30000) eine ziemliche Zeit zum Laufen bräuchte.

Wenn die Annahmen oben soweit stimmen, helfe ich dir gerne beim Codeschreiben :-)

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Collector
*
Beiträge: 15
Registriert: Sa, 21.01.2006 18:54

OptionExplici

Beitrag von Collector »

Hi Toxitom

Du hast es richtig erfasst.

Die Liste kannst Du Dir bei http://www.oldiehitparade.de downloaden.
(hoffe ich darf die Seite erwähnen, ansonsten kann man sie ja löschen)

Nun zu Deinem Programm

Ich habe es ausprobiert und soweit auch verstanden.

Doch wollte ich etwas ändern bzw. gleichzeitig mein Kommentar neben hinschreiben, um zu sehen ob ich die einzelnen Schritte verstanden habe. Dabei bin ich auf ein Fehler von mir gestossen bzw. Unverständnis.

Code: Alles auswählen

Option Explicit	'Hier erzwinge ich, das alle Variablen die in der
				      'Prozedur vorkommen explizit deklariert(ausdrück-
				      'lich bekannt gemacht)werden müssen. Um Fehler zu
				      'vermeiden und die Lesbarkeit zu erhöhen, sollte
				      'man sich angewöhnen die Variablen am Anfang zu
				      'deklarieren, ist aber nicht zwingend notwendig.
				      'Der Befehl muss am Anfang eines Programm stehen

sub Zellen_einlesen	'Als nächstes geben wir einen Namen für die
					       'Prozedur an. Eine Prozedur beginnt mit Sub Prozedur-
					       'name und endet mit end Sub.

'als nächstes werden die einzelnen Variablen deklariert 

Dim i as integer 			'wird als Zählvarible für die erste For-Next Schleife benutzt

Dim oDoc as object	        '????? Hier habe ich meine Probleme
Dim osheet as object		   '????? bzw. kann ich es noch nicht erklären.

Dim sZellString as string    '????? Die Variable sZellString wird als Zeichenkette deklariert
 
  oDoc = thisComponent		'Hier wird auf das aktuelle Dokument zu-
  							     'gegriffen 

  oSheet = oDoc.sheets(0)   'das erste Tabellenblatt wird benutzt

  for i = 1 to 30000      'eine For-Next Schleife mit der Variable i
  							   'wird durchlaufen. 

       sZellString = oSheet.getCellRangeByName("D" & i).string 
       						'Das Zeichenstring sZellString übernimmt die
       						'Zeichenkette von der Zelle D(i)

       REM ----- Als nächstes wird der String nach Kriterien untersucht -----

  next ' Dies ist das Ende der ersten For-Next Schleife wenn die Variable i
         ' den Wert 30000 angenommen hat

 end sub
Meine Fragen:

1. wenn ich OptionExplicit aktiviere bekomme ich eine Fehlermeldung vom Interpreter "Basic Syntaxfehler Erwartet: Sub" angezeigt

2. Sind die Kommentare soweit richtig?

Übrigens vielen Dank für Deine Hilfe, ich kann sie sehr gut gebrauchen, gerade als Anfänger.

Collector

1. Edit: Option_Explicit ist Option Explicit geworden und kleine Fehler im Text, zusätzlich ein Kommentar zu Next angehängt.
Zuletzt geändert von Collector am Sa, 25.11.2006 16:02, insgesamt 1-mal geändert.
Die Menschen fangen immer erst mit Fehlern an, bevor sie sich bessern können. (Mengtse)
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

1. wenn ich OptionExplicit aktiviere bekomme ich eine Fehlermeldung vom Interpreter "Basic Syntaxfehler Erwartet: Sub"
Und was erwartest Du sonst wenn Du ein beliebiges Wort in den Code schreibst und das nicht als Kommentar kennzeichnest?

das ist eine korrekte Anweisung:

Code: Alles auswählen

Option Explicit


und das ein beliebiges Wort:

Code: Alles auswählen

OptionExplicit 


Gruß
Stephan
Collector
*
Beiträge: 15
Registriert: Sa, 21.01.2006 18:54

Beitrag von Collector »

Danke Stephan,

für die Belehrung (Korrektur), das ich das Wort bzw. den Befehl falsch geschrieben habe.

Collector

P.S.

Wie schwierig ist es, dem Urteil eines anderen etwas zu unterbreiten,
ohne sein Urteil durch die Weise, wie man es ihm unterbreitet,
zu verderben! (Blaise Pascal)
Die Menschen fangen immer erst mit Fehlern an, bevor sie sich bessern können. (Mengtse)
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Collector,

OK, deine Kommentare sind soweit OK. Ich füge mal zwei hinzu:

Code: Alles auswählen

Dim oDoc as object   'die Varaible nimmt später das Dokumentenobjekt auf
Dim osheet as object  'diese Variable das Tabellenblatt als Objekt
Soweit dazu. Nun müsst allerdings der Code umgebaut werden - entsprechend den gemeinsam herausgefundenen Randbedingungen. Warum? weil es logische Abschnitte gibt, die als eigene Prozeduren zusammengefasst werden - das erleichtert die Lesbarkeit.

Zum Testen solltest du die eine Datei zusammenbauen, die nicht mehr als 10 Zeilen drin hat - dann sieht man eher etwas.

Zum Code:
Mein Vorschlag wäre zwei bis drei eigenständige Prozeduren:
die erste: Inizialisierung globaler Variablen
die zweite: Schleife über alle Zeilen und Auslesen des Inhalts-Strings
die dritte: Prüfung des Inhaltsstrings und bei Bedarf schreiben des Teilstrings in eine seperate Zelle.

Aufgrund der seperaten Prozeduren benötigen wir globale Variable, die werden außerhalb (ganz oben) definiert. Und damit es schön einfach wird, auch noch eine Startprozedur ganz oben - dann kannst du es auch in der IDE starten (PS: ich lass die Kommentare jetzt weg ;-) )

Code: Alles auswählen

Option Explicit
dim oSheet as object

sub start          'Startmakro
   init
   Lese_Zeile
end sub

sub init
    oSheet = thisComponent.sheets(0)
end sub

sub Lese_Zeile
      dim i as long, sZellString as String
     i = 1     'erste Zeile als Startzeile
     do until oSheet.getCellRangeByName("D" & i).string = ""
           sZellString = oSheet.getCellRangeByName("D" & i).string 
           check_Inhalt(sZellString, i)
            i = i+1
     loop

end sub

sub check_Inhalt(sStr as string, iZeile as long)
     dim aLand()      'Länderkennzeichen
     dim  aSpalte()   'Einzutragende Spalten
      dim n as integer, j as integer
     aLand = Array("D", "USA")
     aSpalte = array("G", "H")
     for n = 1 to 5       'später auf 100 setzen!
         for j = 0 to uBound(aLand)
            if instr(sStr, " " & aLand(j) & " " & n ) then
                  oSheet.getCellRangeByName(aSpalte(j) & n).string = aLand(j) & " " & n
             end if
          next j
       next n
            
end sub
So, das ist der Anfang. Nicht perfekt, aber diene Basis. Was fehlt:
1. Du musst den Suchstring noch besser definieren - jetzt wird auch "D 1" gefunden, wenn dort "D 12" steht. Also anpassen und verbessern.
Außerdem wolltest du je noch eine Kontrolle, ob evt. schon ein höherer Wert in der Zielzelle steht - dann soll nix eingetragen werden.
Aber ein paar Herausforderungen brauchst du ja auch noch ;-)

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Collector
*
Beiträge: 15
Registriert: Sa, 21.01.2006 18:54

Beitrag von Collector »

Hi Toxitom

Danke für den Code, werde ihn mal studieren bzw. entschlüsseln.

Habe noch etwas gefunden bzw. gelesen im Handbuch um Dokumente zu durchsuchen.

Suchen von Textteilen
In vielen Fällen gilt es, einen Text nach einen bestimmten Begriff zu durchsuchen und
die entsprechende Trefferstelle zu bearbeiten. Hierzu bieten alle StarOffice-Dokumente
eine spezielle Schnittstelle, die stets nach dem gleichen Prinzip arbeitet: Vor einem
Suchvorgang muss zunächst ein so genannter SearchDescriptor erstellt werden, der definiert,
was StarOffice in einem Dokument suchen soll. Ein SearchDescriptor ist ein Objekt, das den Dienst
com.sun.star.util.SearchDescriptor unterstützt und über die Methode
createSearchDescriptor eines Dokuments erzeugt werden kann:
Dim SearchDesc As Object SearchDesc = Doc.createSearchDescriptor
Nachdem der SearchDescriptor erzeugt wurde, übernimmt er den zu suchenden Text:
SearchDesc.searchString=′any text′
Von seiner Funktion lässt sich der SearchDescriptor am ehesten mit dem
Such-Dialog von StarOffice vergleichen. Ähnlich wie das Suchfenster lassen sich auch
im SearchDescriptor-Objekt die für eine Suche notwendigen Einstellungen
vornehmen.


ist das etwas womit man arbeiten kann oder ist das für mich noch zu starker Tobak :-)

Collector
Die Menschen fangen immer erst mit Fehlern an, bevor sie sich bessern können. (Mengtse)
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Collector,
st das etwas womit man arbeiten kann ...
Klar kannst du auch damit arbeiten :-)
Viele Wege führen zum Ziel, nur bezeifel ich, ob du damit dieses schneller erreichst.
Der Suchallgorythmus markiert dir die gefundenen Stellen - und ersetzt sie bei Bedarf. Nur - das bringt dich nicht weiter. Du müstest also Position für Position anspringen, die Zeileninformation auslesen und dann entsprechend die Spalten schreiben...

Aber - probier es, du kannst nur lernen :-)

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Collector
*
Beiträge: 15
Registriert: Sa, 21.01.2006 18:54

Beitrag von Collector »

Danke Toxitom,

werde erst mal Dein Programm enträtseln, kann aber einige Tage dauern

:D Wie der Zufall es will, hilft mir der Autor (Gruppe ???) von ISBN 3-89842-657-2 dabei etwas über Makros zu lernen. :wink: (gerade gelesen)

Da hat es sich schon gelohnt das Buch zu kaufen :-) bin aber noch am Anfang vom Lernprozess, deshalb dauert das auch etwas länger mit dem kapieren, besonderst mit dem Kapitel 4.

Aber hier werden Sie geholfen :-)

Collector
Die Menschen fangen immer erst mit Fehlern an, bevor sie sich bessern können. (Mengtse)
Collector
*
Beiträge: 15
Registriert: Sa, 21.01.2006 18:54

Beitrag von Collector »

Hi folks

habe nun das Rohgerüst

Code: Alles auswählen

sub Hauptprogramm	'Hier soll das Programm bzw. die Prozedur mit seinen
					     'Unterprogrammen (Prozeduren oder Funktionen starten)
    
   init 		          'In dieser Prozedur sollen die Variablen deklariert werden
   
   hole_Zeichenkette	 'Mit dieser Zeile wird die Prozedur hole_Zeichenkette
						      'aufgerufen.
						
	vergl_Zeichenkette	'Diese Prozedur soll die Zeichenkette auf Teilstrings
						      'untersuchen.
						
	setze_Wert_in_Zelle  'als letztes wird dieses Programm das Ergebnis in
						      'einer definierten bzw. errechneten Zelle mit einem
						      'bestimmten Wert (Zahl) geschrieben.
    
end sub		'Hier endet das Hauptprogramm

Denke das ist ausreichend unterteilt und übersichtlich, nun kommt der schwerer Teil. (:) Dank Toxitom ist ja der Anfang schon gemacht :))

Btw. die Prozeduren bekommen evtl. noch Parameter mitgeliefert

Noch eine Frage wenn ich alle Variablen im Kopfteil deklariere (öffentliche bzw. lokale Variable) dann kann ich doch "init" Prozedur? weglassen.
Oder übersehe ich dabei etwas bzw. verbaue ich mir da etwas in Bezug auf Haltbarkeit etwas.

Gruß
Collector

Edit 1: habe gerade bei der Bearbeitung festgestellt das die Prozeduren inander verschachtelt sind bzw. nicht linear benutzte werden. Also dies sind nur Module die in dem Macro vorkommen.
Hoffe ich habe die Begriffe Module und Macro nicht vertauscht :)
Die Menschen fangen immer erst mit Fehlern an, bevor sie sich bessern können. (Mengtse)
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Collector,
Noch eine Frage wenn ich alle Variablen im Kopfteil deklariere (öffentliche bzw. lokale Variable) dann kann ich doch "init" Prozedur? weglassen.
Nein. Die Varaiblen werden zwar im Kopfteil deklariert (also erzeugt) nicht aber mit Werten versehen. Das geschieht erst im Init Teil. Natürlich kannst du - bei nur wenigen Werten - diese auch am Anfang der ersten Prozedur mit INhalten füllen - das bleibt dir überlassen - und dann könntest du die Init Prozedur weglassen.
habe gerade bei der Bearbeitung festgestellt das die Prozeduren inander verschachtelt sind bzw. nicht linear benutzte werden
Das müssen sie auch nicht. Wichtig ist eigentlich nur etwas: Eine Prozedur soll einen Arbeitsschritt abdecken - wie oft der letztendlich aufgerufen wird und woher, das spielt keine Rolle. Das ist ja der Sinn der Unterteilungen- immer abgeschlossene Arbeitsschritte definieren und diese dann "recyklen", also so oft wie möglich wiederverwenden - eben zum Beispiel durch die Übergabe von Parametern und die Rücklieferung von Ergebnissen.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Collector
*
Beiträge: 15
Registriert: Sa, 21.01.2006 18:54

Beitrag von Collector »

Hi Toxitom,

danke, für die Antwort.

Bin fast fertig mit dem entschlüsseln und was für mich am wichtigsten ist, es auch zu verstehen (einigermaßen). Deshalb habe (werde ich) zu fast jeden Schritt mein Kommentar schreiben. Wenn es gestattet ist würde ich es gerne hier reinstellen wenn es fertig ist, für Diskussionen bzw. um ein feedback (Kontrolle) zu erhalten.

Bei den Objekt Variablen hatte ich meine Problem. So wie ich das bis jetzt verstanden habe bzw. einfach ausgedrückt, gebe ich nur an, mit welcher Applikation (internen Funktion) ich arbeiten möchte bzw. benutzen oder öffnen möchte.

Habe ich das richtig (grob) verstanden.

Collector
Die Menschen fangen immer erst mit Fehlern an, bevor sie sich bessern können. (Mengtse)
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Collector,

ja, bring deinen Code dann hier rein. Dann könen wir korrigieren oder richtigstellen :-)

Und das mit den Objektvariablen ist nicht ganz korrekt. Alles, was du in OpenOffice.org tust, basiert auf Objekten. Diese bilden einen "Baum", das heisst, sie sind voneinander abhängig. Jedes Objekt kann unterschiedliche Eigenschaften annehmen (Properties), es unterstützt diverse eingebaute Funktionen (methods) und besitzt auch sonst noch ein paar Möglichkeiten.
Ein solches Objekt kannst du auch einer Varaiblen zuweisen - eben einer Objektvariablen.

Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Antworten