Das Notes Forum
Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: LisaS am 19.09.03 - 15:43:32
-
Hallo Leute,
kurz vorm Wochenende noch ein kleines Problem.
Und zwar möchet ich Datensätze welche in einem Text-Feld hintereinander stehen per Script (UIWorkspace) in ein TXT-File schön untereinander schreiben. Den Teil mit dem Txt-File kriege ich wohl hin aber wie lese ich die Datensätze am besten aus. Ich dachte da an ein Array() welches ich mit den einzelnen Elementen fülle.
Die Daten im TextFeld sehen so aus:
01.02.2003|03.04.2003|Kundexy|Branchexy|Schulung;Dokumentation|fließtext;_
01.02.2003|03.04.2003|Kundexy|Branchexy|Schulung;Dokumentation|fließtext;usw
wieviel Datensätze in dem Feld drin sind ist immer unterschiedlich. Wie man sieht sind die einzelnen Elemente mit | getrennt und die einzelnen Datensätze mit ;
Jetzt hab ich mir schon gedacht ich mach mir einen
Type gtDataRec2
StartDat As Variant
EndeDat As Variant
Firma As String
Branche As String
Funktion As String
Task As String
End Type
und sage dann
Dim Array() As gtDataRec2
soweit so gut, aber wie sieht die Schleife zum befüllen der einzelnen Arrays aus?
Wäre nett wenn Ihr mir mit ein Paar Code-Beispielen mal auf die Sprünge helft.
Vieleicht gibt es ja auch noch ne coolere Lösung?
Danke schonmal
Gruß
Hitcher
-
So ganz seh' ich noch nicht durch, wo Dir der Schuh drückt, aber kann es sein, daß Deine "Datensätze" unterschiedlicher Struktur sind?
01.02.2003|03.04.2003|Kundexy|Branchexy|Schulung;Dokumentation|fließtext;01.02.2003|03.04.2003|Kundexy|Branchexy|Schulung;
Wenn ich die ";" als Record-Ende jetzt mal durch CR ersetze, ergibt sich:
01.02.2003|03.04.2003|Kundexy|Branchexy|Schulung;
Dokumentation|fließtext;
01.02.2003|03.04.2003|Kundexy|Branchexy|Schulung;
Sag' mal an !
Bernhard
-
@Bernhard
Das ; hinter fließtext trennt die Datensätze
Die Datensätze sehen also so aus (mit CR ersetzt):
01.02.2003|03.04.2003|Kundexy|Branchexy|Schulung;Dokumentation;...|fließtext;
01.02.2003|03.04.2003|Kundexy|Branchexy|Schulung;Dokumentation;...|fließtext;
01.02.2003|03.04.2003|Kundexy|Branchexy|Schulung;Dokumentation;...|fließtext;
01.02.2003|03.04.2003|Kundexy|Branchexy|Schulung;Dokumentation;...|fließtext;
.
.
.
Gruß
Hitcher
-
Was ist denn nun Dein Datensatz-Trennzeichen? Wären es immer nur ";", dann würde ja eine Schleife genügen à la:
- Lese das Feld aus dem Dokument in eine String-Variable
- Leere alle Variablen in Type
- Lese den String in TempString, bis Feldtrennzeichen auftaucht - schiebe String in Type.Var1 (PLAUSIBILITÄTSPRÜFUNG!)
- Lese weiter, bis nächstes Feldtrennzeichen, schiebe String in Type.Var2 (PLAUSIBILITÄTSPRÜFUNG!)
- usw.
- Bei Erreichen des Trennzeichens für Record wird die letzte TypeVar gefüllt und das ganze mit Write #FileNo Type.Var1, Type.Var2 ... geschrieben.
Dann wieder Type leeren und weitermachen.
Und immer auf Plausibilität prüfen.
Hast Du kein eindeutiges Record-Ende-Kennzeichen, muß der Parser etwas komplizierter ausfallen ...
HTH,
Bernhard
-
... ist es richtig, daß das Semikolon im Datensatz vorkommt und als Trennzeichen zu verstehen ist? - dann geht da was schief, dann müßtte man zumindest wissen das wievielte den Datensatz trennt...
... besser wäre natürlich eine CarriageReturn als Trenner der Datensätze, dann könntest du Zeilenweise vorgehen und mit @Expolde die einzelnen Bestandteile zwischen den Pipe's ermitteln...
ata
-
Hallo, Hitcher,
ist eigentlich sichergestellt, daß in "Fliesstext" das Semikolon nicht vorkommen kann? Amsonsten bist Du nämlich hoffnungslos verloren ...
Ansonsten kannst Du meinen Algorithmus-Vorschlag dahingehend erweitern, daß sowohl das Pipe-Symbol als auch das Semikolon als Feldtrennzeichen angesehen wird, und dann zählst Du die Felder - nach x Feldern siehst Du einen Rekord als ausgelesen aus und schreibst ihn ins CSV-File.
HTH,
Bernhard
-
@Bernhard:
Im Fließtext kommt kein Semikolon vor, daß wurde vorher sicher gestellt.
@all:
Ich habe das Problem, daß ich hunderte von Dokumenten habe die leider schon mit diesen Datensätzen gefüllt sind.
01.02.2003|03.04.2003|Kundexy|Branchexy|Schulung;Dokumentation;...|Fließtext;
Die einzelnen Elemente eines Datensatzes habe ich farbig markiert.
Nur das Semikolon hinter dem Fließtext soll die einzelnen Datensätze von einander trennen. Die Semikolons im pinken Element sind zur Trennung der einzelnen Begriffe innerhalb des Elementes.
Kann man nicht irgend wie die Pipes zählen und dann bis zum Semikolon und dann den nächsten Datensatz. Aber wie?
Gruß
Hitcher
-
... kannst du erreichen, daß hinter dem Semikolon ein Zeilenumbruch erfolgt, dann kannst du zeilenweise einlesen und mit @Explode die einzelnen Bestandteile voneinander trennen...
... ansonsten einen @Explode auf das Semikolon und dann jedes Element nochmals einen @Explode auf die Pipe...
... es sollten nur nicht mehr als 64K Zeilen sein, wegen der Indexgrenze bei Arrays...
ata
-
@ata:
Zeilenunbruch ist nicht drin, weil die Dokumente ja schon angelegt sind.
Dann werde ich mich mal mit @explode beschäftigen...
Gruß
Hitcher
-
@Explode bringt nix wegen fehlendem eineindeutigem Field Delimiter. Liest jemand eigentlich, was ich zur Problematik in diesem Thread schon geschrieben habe?
Bernhard
-
@Hitcher
... du hast weiter oben einen ziemlich langen Link - kannst du dem einen Umbruch geben - der Text liest sich in der Breite sehr schlecht - danke...
@koehlerbv
... ich habe gelesen, was du gepostet hattest. Nur ich will noch nicht so schnell passen - vielleicht gibt es einen Nenner, den man noch nicht kennt...
Unklar ist mir, ob in dem Bereich...
Schulung;Dokumentation;...
... mehrere Schulungen und Dokumentationen vorkommen können.
... gibt es Schlüsselwörter, an denen man eventuell einen Abschnitt erkennen kann...
... kann man die Datei auch nochmals neu in einer korrigierten Form bekommen?
ata
-
@all:
Ich habe jetzt ein neues Feld angelegt, welches ich mit @word wie folgt gefüllt habe.
die Semikolons habe ich mit / ersetzt, außer dem ist jetzt nach jedem Datensatz ein Zeilenumbruch.
01.02.2003|03.04.2003|Kundexy|Branchexy|Schulung/Dokumentation/...|fließtext;
01.02.2003|03.04.2003|Kundexy|Branchexy|Schulung/Dokumentation/...|fließtext;
01.02.2003|03.04.2003|Kundexy|Branchexy|Schulung/Dokumentation/...|fließtext;
01.02.2003|03.04.2003|Kundexy|Branchexy|Schulung/Dokumentation/...|fließtext;
.
.
.
Ich denke jetzt müßte es einfacher gehen.
Wie könnte jetzt der Code aussehen um die sechs Elemente in ein Array() zu bekommen?
Gruß
Hitcher
-
... die Datei Zeilenweise einlesen...
... mit
vArray = Evaluate( {@Explode( sZeile ; "|" )})
... erhälst du die einzelnen Bausteine in einem Array, die du dann auswertest - das erste Element ist ein Datum, ebenso das zweite, das dritte ist der Kunde - also
For i = 0 to Ubound(vArray)
If i = 0 Then
Datum1 = vArray(0)
Elseif i = 1 Then
Datum2 = vArray(1)
Elseif i = 1 Then
Kunde = vArray(2)
' # usw.
End If
Next
ata
-
ata, Hitcher will keine Textdatei lesen, sondern eine schreiben ...
Also, nochmal, was ich am 19. geschrieben habe:
- Lese das Feld aus dem Dokument in eine String-Variable
- Leere alle Variablen in Type
- Lese den String in TempString, bis Feldtrennzeichen auftaucht - schiebe String in Type.Var1 (PLAUSIBILITÄTSPRÜFUNG!)
- Lese weiter, bis nächstes Feldtrennzeichen, schiebe String in Type.Var2 (PLAUSIBILITÄTSPRÜFUNG!)
- usw.
- Bei Erreichen des Trennzeichens für Record (ist bei Dir jetzt ja wohl Chr$ (10) wird die letzte TypeVar gefüllt und das ganze mit Write #FileNo Type.Var1, Type.Var2 ... geschrieben.
- Und weiter wieder bei "Leere alle Variablen in Type
und so weiter ...
HTH,
Bernhard
-
@ata:
Also, so sieht jetzt der code aus:
--------------------------------------------------------------------
Sub Click(Source As Button)
Dim workspace As New NotesUIWorkspace
Dim dsp As gtDataRec2
Dim vArray As Variant
Dim sZeile As String
Dim vtxt As Variant
Dim Item As Notesitem
Dim i As Integer
Set gUIDoc = workspace.CurrentDocument
Set gDoc = gUIDoc.document
Set gvRTitem = gDoc.GetFirstItem( "ObjCont" )
Set Item = gDoc.GetFirstItem( "dspProjekte_3_1_2" )
gsUnid = gDoc.UniversalID
' Pfade werden zugewiesen
gsWorkDir="c:\"
gsFileName1 = "projekte1.txt" 'Für den Export nach Word
gsFileName2 = "projekte2.txt" 'Für die Berechnug/Anzeige in dem Dokument
vtxt=gDoc.GetItemValue( "dspProjekte_3_1_2" )
giFileNum1% = Freefile()
Open gsWorkDir+gsFileName1 For Output As giFileNum1%
giFileNum2% = Freefile()
Open gsWorkDir+gsFileName2 For Output As giFileNum2%
Forall a In vtxt
sZeile=a
vArray = Evaluate({@Explode( sZeile ; "|" )})
For i = 0 To Ubound(vArray)
If i = 0 Then
dsp.SDat = vArray(0)
Elseif i = 1 Then
dsp.EDat = vArray(1)
Elseif i = 2 Then
dsp.Firma = vArray(2)
Elseif i = 3 Then
dsp.Branche = vArray(3)
Elseif i = 4 Then
dsp.Funktion = vArray(4)
Elseif i = 5 Then
dsp.Task = vArray(5)
End If
Next
gsWritestr=dsp.SDat+"|"+dsp.EDat+"|"+dsp.Firma+"|"+dsp.Branche+"|"+dsp.Funktion+"|"+dsp.Task+"$"
Print #giFileNum1% ,gsWritestr
Write #giFileNum2% _ ,dsp.SDat,dsp.EDat,dsp.Firma,dsp.Branche,dsp.Funktion,dsp.Task
End Forall
Close giFileNum1%
Close giFileNum2%
dspMask
Attach
Call ReOpen(gDoc)
End Sub
-----------------------------------------------------------------------------------
allerdings wird in vArray(0) nichts eingelesen.
Wenn ich das richtig verstanden habe, dann müßte,
'vArray = Evaluate({@Explode( sZeile ; "|" )})',
doch die Zeile innerhalb von vArray aufbröseln.
@Bernhard:
Der Code enstpricht doch ungefähr deinem Vorschlag, nur das mit der Plausibilitäts-Prüfung habe ich noch nicht ganz geschnallt.
Gruß
Hitcher
-
Bevor wir an der falschen Stelle suchen, ein paar Fragen:
- Welchen Feldtyp hat dspProjekte_3_1_2 ?
- Sind Mehrfachwerte zugelassen ? Welches Trennzeichen ?
- Wie sieht das Feld in den Document Properties aus ?
- Wie sieht im Debugger vText nach der Zuweisung aus ? Paßt da noch alles ?
Und dann schau'n wir mal ;-)
Bernhard
-
@Bernhard:
Sorry, daß ich jetzt erst antworte, aber imein Notebook ist kpl. abgeschmiert >:( >:(
Also
zu 1.: Feldtyp = Text
zu 2.: Mehrfachwerte - ja / Trennzeichen - Semikolon Anzeigen mit neuer Zeile
zu 3.: "01.02.2003|03.04.2003|Kundexy|Branchexy|Schulung/Dokumentation/...|fließtext;"
zu 4.: siehe 3
Ok, an der Stelle nochmal Danke für Eure Hilfe.
Gruß
Hitcher