@Formula -> csv-Datei auslesen

  • Hallo Leute,
    muss einen Agent schreiben mit Hilfe der @Formula language schreiben der eine *.csv Datei ( z.B. Inhalt: werner, 12345, 53698, kdjfdkj usw.) erstmal nur ausliest :(
    Bitte HILFE !!!

  • Ich denke ohne LS wirst du nicht allzu weit kommen. Notes kann ja nur Structured Text, Tabbed Text und 123 Files von Hause aus verarbeiten und mit @Formeln hast Du keinen direkten Dateizugriff.....

  • Hallo,
    erstmal danke.
    hab mich mit LS auseinander gesetzt :)
    mit dem agenten kann ich jetzt auf die dtei zugreifen.
    jetzt muss ich die daten , die durch komma getrennt sind, den variablen übergeben ( jeweils ein string pro variable ohne komma und leerzeichen)...
    wie mache ich das den ??
    danke...

  • Hier ein Beispiel wie du mit LotusScript CSV-Files parsen kannst:


    intAnzahl =0
    impfile = "C:\test.csv"
    intNum = Freefile()

    Open impfile For Input As intNum


    Do While Not Eof(intNum)
    Line Input #intNum, strZeile
    strOrder = Strtoken(strZeile, "|",1)
    strStatus = Strtoken(strZeile, "|",2)
    Print "Bestellung " & strOrder & " Status: " & strStatus
    Loop


    Meine CSV ist wie folgt aufgebaut:
    13245|2
    45678|4


    lg,
    ayhan

  • danke
    den ersten Teil meiner Aufgabe hab ich schon gelöst...
    hier mein ergebnis:


    Sub Initialize

    Dim Kunden List As Long
    Dim pfad As String

    pfad ="c:\*.csv"
    filenum=Freefile()

    Open pfad For Input As filenum
    i=0

    Do While Not Eof(filenum)
    Input #filenum, kunden(i)
    i=i+1
    Loop

    Forall x In Kunden
    Msgbox x
    End Forall


    Close filenum
    Erase kunden ' löscht die Daten (Kunden List)

    End Sub

  • und weiter gehts... :)


    ich habe den const pfad definiert:
    pfad ="g:\Kunden.csv"


    gibt es möglichkeiten dass ich selbst nach der Datei suche sowas wie " Datei öffnen ... "usw. (mit netzwerkzugriff z.B.windows-explorer) ???
    hab nur das hier als alternative gefunden:
    pfad=Inputbox ("Bitte geben Sie den Pfad ein:")
    ist aber sch..e weil ich die dateiendung mit eingeben muss :(

  • Sicher:


    Dim ws As New NotesUIWorkspace


    v_ReturnValue = ws.OpenFileDialog(False, "Wählen Sie eine CSV-Datei aus", "CSV Files|*.CSV", "C:\")
    If Not Isarray(v_ReturnValue) Then Exit Sub
    'If v_ReturnValue(0) = "" Then Exit Sub
    fileName = v_ReturnValue(0)



    Au ja:
    Da hier die Frontend-Klasse (NotesUIWorkspace) verwendet wird, ist auch klar, dass der Agent nicht periodisch laufen kann. Muss also manuell ausgeführt werden - nur so zur Info...


    lg,
    ghostxxl

  • vielen dank !!!
    funktionieren tut es auch
    verstehen tue ich nur die ersten paar zeilen den rest nicht mehr

    Dim ws As New NotesUIWorkspace
    v_ReturnValue = ws.OpenFileDialog(False, "Wählen Sie eine CSV-Datei aus", "CSV Files|*.CSV", "C:\") -> das hier ist klar


    und das hier garnicht:
    If Not Isarray(v_ReturnValue) Then Exit Sub
    'If v_ReturnValue(0) = "" Then Exit Sub
    fileName = v_ReturnValue(0)

  • Einfacher als du denkst,
    es wird nur überprüft, ob der Benutzer in diesem Dialog auch eine CSV-Datei ausgewählt hat (er könnte ja auch nur auf abbrechen gehen und dann würde das - wenn es nicht abgefangen wird - zu fehlern in deinem code führen).


    Einfache Erklärung ohne kompliziert zu werden:
    "If Not Isarray(v_ReturnValue) Then Exit Sub"
    Da v_ReturnValue vom Typ Constant definiert wird und eigentlich nur den kompletten Pfad der CSV zurückgeben soll, wird überprüft, ob die Variable belegt ist. Wenn nein, soll die Ausführung des Codes abgebrochen "Exit Sub" werden.


    "fileName = v_ReturnValue(0)"
    Wenn die Variable nicht leer ist, wird die Variable fileName mit der Variable v_ReturnValue (1. Element des Arrays v_ReturnValue --> v_ReturnValue(0)) belegt.


    Es ist die einfachste Erklärung, hoffe das hilft dir.


    lg,
    ghostxxl

  • jetzt ist es mir klar :) Danke!
    muss jetzt in der DB nach einem doc suchen der diese Kundennummer im Feld Number beinhaltet ...

    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim collection As NotesDocumentCollection
    Dim doc As NotesDocument
    Set db = session.CurrentDatabase
    Set collection = db.UnprocessedFTSearch( ??? )
    For i=0 To Eof
    For c = 1 To collection.Count
    Kunde(i) =FIELD (Number)
    Next
    Next
    Ähhh...
    jetzt blick ich ja selbst nicht mehr durch... :-?

  • Hy,


    ftsearch dauert doch immer so lang. Ich würde folgendes machen:


    1. Erstelle eine Ansicht. Die erste Spalte sollte kategorisiert sein. Der Wert für diese Spalte sollte die Kundennummer beinhalten. Zeige in der Ansicht alle Dokumente an, die du später über deinen Script auch bearbeiten möchtest.


    2. In deinem Script gehst du dann wie folgt vor:
    Dim coll As NotesDocumentCollection
    Dim view As NotesView


    Set view = db.GetView("deineansicht")
    Set coll = view.GetAllDocumentsByKey("12345", True) 'alle Dokumente mit dieser Kundennummer in coll holen


    If coll.Count > 0 Then
    Set doc = coll.GetFirstDocument
    For i = 0 To (coll.Count - 1)
    <aktion>
    Set doc = coll.GetNextDocument(doc)
    End Forall
    End If


    usw.



    Das geht dann viel viel schneller und auch einfacher zum Programmieren. Hoffe, das hilft dir.


    P.S. Den Code habe ich hier einfach runtergeschreiben. Evtl. sind rechtschreibfehler drin bzw. nicht alle variablen initialisiert..


    lg,
    ghostxxl

  • Hallo,
    ich glaube ich habe mich da vertan...
    es soll nach einem dokument (parent) gesucht werden der diese Kundennummer enthält. bei übereinstimmung sollte es noch ein paar werte aus dem doc auslesen und in eine externe datei reinschreiben. nächste KD-Nr/ und wieder das gleiche usw...

  • vorschläge wie ich das machen könnte ?
    das hier funktioniert nicht so ganz...
    ich glaube es wird garnicht auf das dokument zugegriffen...


    Dim anzahl As Long
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim doc As NotesDocument
    Set db = session.CurrentDatabase
    Set collection = db.AllDocuments
    anzahl= collection.Count
    Set doc = collection.getfirstdocument
    Msgbox anzahl

    Dim inhalt As String
    i=0
    a=0
    Do
    Set doc = collection.GetNthDocument( a )
    Msgbox Kunden_Num
    inhalt=Cstr(Kunden_Num) ' Das Feld Kunden_Num ist ein "Number"-Feld

    If kunden(i) =Cstr( inhalt) Then
    Msgbox kunden(i)
    End If
    a=a+1
    Loop Until a=anzahl

  • Um gottes willen schreib diese routine um von GetNthDocument auf einen GetFirstDocument & GetNextDocument kombination, der GetNthDocument ist der umproduktivste aufruf die mann sich nur vorstellen kann. Der macht folgendes, JEDESMAL.. greif das erste dokument in der Kollection, und zähle solange durch den einzelne dokumente bis du beim Nth angekommen bist. KEIN SCHERZ.
    Diese routine ist schon messbar langsamer wenn der collection 10 Dokumente beinhaltet, auf dem moment würde den GetFirt/Next 55 dokumente in den gleichen zeit verarbeiten. Bei 50 Dokumente schon über 1200 mit First/Next

  • hallo,
    kann ich den meine csv-datei (bevor ich die durch komma getrennte daten auslese) trimmen?
    oder muss ich den kompletten inhalt einer variable übergeben, dann trimmen und dann aus der variable auslesen ?

  • Entweder du entfernst unnötige Leerzeichen bereits vor dem Export (ist vielleicht einfacher) oder eben erst nach dem Einlesen. Da es sich hier um binäres Lesen von Daten handelt werden immer alle Leerzeichen mitgelesen und du mußt die Behandlung selbst durchführen, also innerhalb der Variablen.

    • Offizieller Beitrag

    mit Trim() in Lotusscript oder mit @trim() als Funktion


    Gruß
    Dirk

    Rein logisches Denken verschafft uns keine Erkenntnis über die wirkliche Welt.
    Alle Erkenntnis der Wirklichkeit beginnt mit der Erfahrung und endet mit ihr.
    Alle Aussagen, zu denen man auf rein logischen Wegen kommt, sind, was die Realität angeht, vollkommen leer.
    Albert Einstein