Daten aus einem Text auslesen

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

Moderator: Moderatoren

Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: Daten aus einem Text auslesen

Beitrag von Karolus »

Hallo

Ist die erste * Endmarkierung tatsächlich da wo du sie geschrieben hast,oder ist das ein Fehler ?

Woher kommen die Texte ? ( evtl. könnte man die Quelle direkt auswerten )

Kopierst du so einen Textblock in eine Zelle hinein, oder sind das ca. 9 ( ? ) Zellen ( mit 3 leeren Zellen mittendrin ) untereinander.

Sind die "Schlüsselwörter" ( Kontrakt , Absender , 'Verkauf von' , nach, '(Qualität * )', Einzelpreis ) immer (exakt ?) gegeben, oder gibts da Variationen.
Ist die allgemeine Struktur (Zeilenumbrüche , Leerzeilen, relative Position der Schlüssel ) der Texte einigermassen fix oder eher variabel?

Das ist mit Calcbordmittel wahrscheinlich nicht lösbar, beantworte meine Fragen am besten gleich in einem neuen Thema im Basic-forum.

@Winfried : Kannst du das Thema verschieben ? - danke.

Gruß Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: Daten aus einem Text auslesen

Beitrag von Karolus »

Hallo
Ich hab nur geschrieben das die Aufgabe mit Bordmitteln von Calc nicht sinnvoll lösbar ist, das schließt aber nicht aus das die Daten in Calc landen.
Ich kopiere den Text in ein Zeile und
Wirklich in eine Zeile ( mehrere Zellen nebeneinander ) ??
Und woher ich die Texte habe? Sie sind aus einem Online Handelsspiel (Kapi-Regnum)
Also "copy and paste" aus einer Website, ist diese Seite allgemein erreichbar, falls ja wäre die Adresse recht nützlich.

Gruß Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: Daten aus einem Text auslesen

Beitrag von Karolus »

Hallo
Kannst du mal aus so einer "Kontrakt"-seite heraus umschalten auf →Ansicht →Quelltext anzeigen ... und den relevanten Html-Quellcode herauskopieren, lokal abspeichern, in ein Zip-archiv packen und hier anhängen ?
( Um Dateien anhängen zu dürfen musst du hier registriert sein und angemeldet ! )

Gruß Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Loprema
Beiträge: 7
Registriert: Di, 19.07.2011 17:29

Re: Daten aus einem Text auslesen

Beitrag von Loprema »

also den quellcode kann ich als anhang hier reinstellen. aber den relevanten teil herausfiltern übersteigt meine kentnisse total.
falls du dir das spiel mal ansehen willst kann ich kurzfristig das passwort ändern und dir zur verfügung stellen.
Kontrakt.zip
(6.68 KiB) 42-mal heruntergeladen
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: Daten aus einem Text auslesen

Beitrag von Karolus »

Hallo
So:
Der Basiccode:

Code: Alles auswählen

REM Keep a global reference to the ScriptProvider, since this stuff may be called many times:
Global g_MasterScriptProvider
REM Specify location of Python script, providing cell functions:
Const URL_Main = "vnd.sun.star.script:sheetfunction.py$"
Const URL_Args = "?language=Python&location=user"

Function getMasterScriptProvider()
   if NOT isObject(g_MasterScriptProvider) then
      oMasterScriptProviderFactory = createUnoService("com.sun.star.script.provider.MasterScriptProviderFactory")
      g_MasterScriptProvider = oMasterScriptProviderFactory.createScriptProvider("")
   endif
   getMasterScriptProvider = g_MasterScriptProvider
End Function 

Function kontrakt_aus_datei( text )
   sURL = URL_Main & "kontrakt_aus_datei" & URL_Args
   oMSP = getMasterScriptProvider()
   oScript = oMSP.getScript(sURL)
   x = oScript.invoke( Array( text),Array(),Array())
   kontrakt_aus_datei = x
end function

Function kontrakt_aus_zelltext( text )
   sURL = URL_Main & "kontrakt_aus_zelltext" & URL_Args
   oMSP = getMasterScriptProvider()
   oScript = oMSP.getScript(sURL)
   x = oScript.invoke(Array( text ),Array(),Array())
   kontrakt_aus_zelltext = x
end Function
Den kopiertst du in eine neues Modul unter →Meine Makros→Standard...

Pythonsourcecode:

Code: Alles auswählen

# -*- coding: utf-8 -*-

from __future__ import division
import sys
import uno
import re , urllib, urllib2

wrapper = uno.createUnoStruct('com.sun.star.script.ArrayWrapper')
wrapper.IsZeroIndex = False

def kontrakt_aus_datei( surl ):
    with open( surl ) as text:
        text = text.read()
    return kontraktaustext( text )

def kontrakt_aus_zelltext( zelltext ):
    return kontraktaustext( zelltext.encode("utf8"))

    
def kontraktaustext(text):
    text = "%s" %(text)
    pattern = re.compile(
        
        r".*?Kontrakt Nr\. (\d+)"           # Kontraktnr.
        ".*?Absender: ([\w äüößÄÜÖ]+)"      # von ?
        ".*?nach ([\w äöüßÄÜÖ]+)"           # nach ?
        ".*?([\d.]+) ([\w äöüßÄÜÖ]+?)"      # Menge und Produkt
        "\s*\(Qualit(?:ä|ä)t (\d+)\)"  # Qualität
        "\s*Einzelpreis: ([\d,]+)", re.S )  # Preis
    
    liste = pattern.findall( text )
    wrapper.Array = tuple( liste )
    return wrapper
Da nimmst du am besten das angehängte Zip-archiv und entpackst es in den Ordner ~/user/Scripts/ deines OOobenutzerverzeichnisses ( den Pfad dorthin findest du unter →Extras→Optionen→OOo→Pfade... )
Danach kannst du in Calc mit der Funktion:

Code: Alles auswählen

=kontrakt_aus_zelltext(A1)
( ! als Matrixfunktion mit strg+shift+enter bzw. mit der [x]Matrix-option im Formelassistenten )
deine gewünschten Daten in 7 Zellen nebeneinander ausgeben lassen.
Mit etwas Glück*** kannst mit der anderen Funktion "kontrakt_aus_datei"**** die Daten direkt aus einer Datei auslesen, in dem Fall dann mit dem Pfad zu Datei als Argument.

***Sie braucht richtig viel Zeit bei meinen Tests
****Edit: Jetzt läuft auch die Funktion in normaler Geschwindigkeit
*******edit2: Den Syntaxfehler im Pythonscript berichtigt.
python.zip
(832 Bytes) 31-mal heruntergeladen

Gruß Karo
Zuletzt geändert von Karolus am Fr, 22.07.2011 16:03, insgesamt 1-mal geändert.
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Loprema
Beiträge: 7
Registriert: Di, 19.07.2011 17:29

Re: Daten aus einem Text auslesen

Beitrag von Loprema »

Irgend etwas mache ich wohl immer noch Falsch :-(
Ich bekomme immer die im Anhang stehende Fehlermeldung
Dateianhänge
Fehler.zip
(72.55 KiB) 25-mal heruntergeladen
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: Daten aus einem Text auslesen

Beitrag von Karolus »

Hallo
Mit der Fehlermeldung kann ich nun auch nichts anfangen (scheint sich um eine Datei mit einem falschen Zeitstempel zu handeln -kA ), ich hab gerade eine andere Fehlermeldung gefixt, hier funktionierts nun auch unter Win-Xp in einer Virtualbox ( bis auf ein verkorkstes Ä in "Kandierte Äpfel" )

Gruß Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: Daten aus einem Text auslesen

Beitrag von Karolus »

Hallo
Mach mal einen Rechtsklick auf sheetfunction.py und schau unter ->Eigenschaften nach Erstellungs und Änderungsdatum ?

Gruß Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Loprema
Beiträge: 7
Registriert: Di, 19.07.2011 17:29

Re: Daten aus einem Text auslesen

Beitrag von Loprema »

Hmm, daran könnte es liegen...

Erstellt: 22 Juli ....
Geändert 21 Juli ....

Ich denke mal das kann so nicht ganz richtig sein. Mal schauen ob ich das irgendwie geändert bekomme. Leider habe ich heute keine Zeit mehr dafür.

Vielen Dank noch einmal :-)
Antworten