Das Notes Forum
Domino 9 und frühere Versionen => ND9: Entwicklung => Thema gestartet von: Tode am 14.01.16 - 10:21:50
-
Irgendwie habe ich gerade ein Brett vor dem Kopf.
Folgendes Szenario: ich exportiere 150.000 Dokumente in ein CSV- File. Da ich erst während des Exports erfahre, welche Felder in den Dokumenten vorhanden sind, kann ich die "Header"- Zeile mit den Feldnamen erst als allerletztes schreiben.
Aktuell habe ich es so, dass ich alle Werte in einer Liste sammle, und dann am Ende erst schreibe.
Das hat aber den Nachteil, dass ich keinerlei Fortschritt im file sehe, bis die gesamte Liste erstellt habe.
Nun wollte ich das umstellen, dass jede Zeile sofort geschrieben wird, aber ich bin irgendwie blind und finde keine (einfache) Möglichkeit, ganz am Ende den Cursor in die erste Zeile des Files zu setzen, und den Titel hinzuzufügen...
Natürlich kann ich einfach ein neues File erzeugen, und Zeile für Zeile rüberkopieren, aber das kann doch irgendwie nicht Sinn der Sache sein...
Kann mir jemand über den blinden Fleck weghelfen?
-
Wenn Du nur den Fortschritt sehen willst, Printe jedes 1000. oder 10.000. Dokument einen Status, das stört das System nicht (im Gegensatz zu 150.000 Prints).
Ansonsten könntest Du (zumindest unter Windows) zwei Datei schreiben, eine mit dem Titel, die zweite mit den Daten und dann auf BS-Ebene mit type daten.csv > header.csv (sinngemäß so, die genaue Syntax müsste ich in meinem historischen DOS 5.0 Buch nachsehen ;) ). Da gibt es auch eine Option, dass die Daten angehängt werden
-
Vielleicht hilft Dir 'Seek' weiter:
https://www-01.ibm.com/support/knowledgecenter/SSVRGU_9.0.1/com.ibm.designer.domino.main.doc/LSAZ_SEEK_STATEMENT.html?lang=de
Mit: Seek #intFileNum, 1
Wird der Zeiger wieder auf die erste Position gesetzt und anschließend ab da fleißig überschrieben.
[EDIT]
Du musst als erste Zeile dann einen Platzhalter für die Headerzeile schreiben. Da Du die Länge vorher nicht kennst, kann das etwas tricky sein.
-
@Peter: Das mit dem Fortschritt printen habe ich schon... Der Export dauert aber -je nach Typ der Dokumente- sehr lange... Und wenn man dann in einem anderen Programm was schaut, dann baut Windows das "blockierte" Fenster nicht mehr auf -> Keine Statuszeile mehr sichtbar
Das mit dem concat auf OS- Ebene habe ich mir auch schon überlegt, vermutlich würde ich da am besten zurecht kommen.
@Andrew: Genau den Weg habe ich gerade probiert (hatte nach verfassen des Posts auch nochmal die Hilfe durchstöbert). Das Problem ist -wie Du schreibst- Dass ich VORHER wissen muss, wie lange die Zeile wird, denn Put schreibt nur, wenn die korrekte Länge vorher bekannt ist, und Write schreibt zwar an die richtige Stelle, überschreibt aber so viele Bytes wie es braucht, und wenn der Bytecount über mehrere Zeilen geht, dann fehlen halt Teile des Inhalts...
-
Hi,
wie wäre es mit einem Excel-Export? Anschließend speicherst du die Tabelle aus Excel in einer CSV ab.
Bei Excel hättest du ja den Vorteil, dass du beim Export einfach die erste Zeile frei lässt und dann am Ende füllst.
Lieben Gruß
Thorsten
-
Selbst, wenn das eigentliche Zielsystem auch Excel lesen könnte: Die Exportzeiten steigen durch Excel gegenüber CSV dramatisch an. Torsten spricht ja von einer sechstelligen Anzahl von "Records".
Bernhard
-
Es geht nicht ohne umkopieren oder zwischenspeichern im RAM, da du, wenn du am Anfang einer Datei was einfügen willst, die nachfolgenden Bytes nach hinten verschieben musst. (ausser du reservierst den Platz, was wiederrum nicht so einfach geht, da du die Länge nicht kennst.)
Falls die Liste ein Performance-Problem hat, kannst du die CSV-Daten ggf. in einem RT-Feld zwischenspeichern. Da gibts auch einen Navigator, mit dem man Zeilen oben einfügen kann (wobei im RT-Feld max. 65k Zeilen Platz haben)
Gruß
Roland
-
evtl. hilft dir dieser Uralt-Post :
http://atnotes.de/index.php/topic,12371.0.html
-
Falls es Notesdatabase.getfields noch gibt, zumindest ist es nicht in der Designerhilfe zu finden, würde das dann doch über das Ziel hinaus schießen, da er ja nur (bestimmte?) Dokumente exportieren will.
Ich verstehe die Aussage "Da ich erst während des Exports erfahre, welche Felder in den Dokumenten vorhanden sind" nicht ganz.
Mir schwebte da die Idee im Kopf herum beim Zugriff auf das erste Dokument die Items abzuklappern und dann mittels NotesItem.name die Feldnamen zusammenzustellen. Aber vielleicht denke ich da zu kurz, da ich wie gesagt nicht ganz verstanden habe, was mit der Aussage gemeint war.
Bye
Markus
-
Und wenn Du es kombinierst? Du speicherst jeden Datensatz in einer Datei UND in der Liste. Dann schreibst Du eine neue Datei mit dem Titel und den Daten und löschst die erste Datei. Das Schreiben der Datei wird vermutlich nicht der Zeitfresser sein, sondern das Zusammensuchen der Daten.
-
Felder ist natürlich nicht richtig (die bekommt man ja über NotesForm.Fields heraus, und mehr kann es nicht geben), sondern es muss um die Items gehen. Und was da in den Documents drin steckt, kann man vorher nicht (sicher) wissen. Selbst Stichproben machen die Sache im Vorfeld nicht wasserdicht.
Wenn dann noch dazu kommt, das evtl. nur exportiert werden soll, wenn bestimmte Bedingungen erfüllt sind ... Torstens Ansinnen ist daher aus meiner Sicht völlig nachvollziehbar.
Bernhard
-
Danke Bernhard für die "Richtigstellung", die natürlich genau ins schwarze trifft.
@peter: Ja, das hatte ich auch schon überlegt. Aktuell habe ich es so gelöst, dass einfach die Titel ans Ende geschrieben werden mit einem entsprechenden Hinweis...
Damit konnte ich den Fehler in den Daten finden und beheben.
Darum ging es eigentlich: Der Export hat geloopt und ich konnte nicht rausfinden wo, ohne die Dokumente rauszuschreiben identifizieren und beheben (Ursache für den loop war eine MIME- Konvertierung, die nicht fertig wurde, weil ein Virenverseuchtes Word- Dokument drin war, das der Virenscanner weggeschmissen hat, als der Client das Ganze im tmp- Verzeichnis gespeichert hat)