Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: lotus blue am 06.08.07 - 13:26:50

Titel: Per LS CSV-Datei importieren
Beitrag von: lotus blue am 06.08.07 - 13:26:50
Hallo Leute ;),

ich hab eine Anwendung in der per Agent Daten einer ldif-Datei ausgelesen und abgespeichert werden sollen. Bisher klappte das über ne wk4-Datei.

Da dieses Daten nun über LDAP zugänglich sind, wollt ich mich mal an dieses Thema ranwagen.

Habe mich mal durchgelesen zum Theam LDAP, aber noch nichts konkretes gefunden.
Ist der Import überhaupt per LS möglich?

Habe bisher nur mit WK4-Formaten zu tun gehabt und die haben gefunzt.

Gruß Jason

Titel: Re: Per LS Daten von LDAP abholen
Beitrag von: eknori am 06.08.07 - 13:39:29
guckst du http://atnotes.de/index.php?topic=36782.0
Titel: Re: Per LS Daten von LDAP abholen
Beitrag von: lotus blue am 06.08.07 - 13:56:57
guckst du http://atnotes.de/index.php?topic=36782.0

Danke. Hatte ich mir bereits reingezogen. Dennoch sind fragen offen.
Hast PN. 
Titel: Re: Per LS Daten von LDAP abholen
Beitrag von: m3 am 06.08.07 - 14:13:57
Wenn Du die Fragen hier stellen würdest, könnten auch andere davon profitieren.
Titel: Re: Per LS Daten von LDAP abholen
Beitrag von: lotus blue am 06.08.07 - 15:13:19
Wenn Du die Fragen hier stellen würdest, könnten auch andere davon profitieren.

Ja Fragen sind offen ;D, aber im Grunde fehlt es daran, dass es im Beitrag von eknori um Java, dll´s usw. geht
und momentan ist bei mir LS+Formelsprache Ende.

Deshalb hilft dieses Beispiel "noch" wenig.

Titel: Re: Per LS Daten von LDAP abholen
Beitrag von: eknori am 06.08.07 - 15:14:05
um LS geht es dort aber auch ...
Titel: Re: Per LS Daten von LDAP abholen
Beitrag von: lotus blue am 06.08.07 - 15:19:26
um LS geht es dort aber auch ...

Achso ;D. Ja darum das noch in "".
Tüfftle schon rum, mal schaun. Aber es bleibt schwierig , schwierig 8) ???
Titel: Re: Per LS Daten von LDAP abholen
Beitrag von: diali am 06.08.07 - 15:27:50
die benötigten Funktionen aus den DLLs werden im Scrit mit z.B.
Code
Declare Function ldap_init Lib "wldap32.dll" ...
eingebunden (siehe auch eknoris Code). Danach kannst Du die Funktionen aus den DLLS wie Funktionen im Script verwenden. Die Funktionsweise und Syntax (Variablen und Typen) kann Dir dabei nur die Doku der DLL oder der Entwickler erklären.
Titel: Re: Per LS Daten von LDAP abholen
Beitrag von: diali am 06.08.07 - 15:52:50
Zitat
Danke. aber....
« Senden an: diali am: Heute um 15:41:53 »

Danke für Deinen Tipp.
Ich versteh momentan aber nur Bahnhof.
Für was benötige ich überhaupt die dll´s?
Reicht es nicht in LS was zu programmieren?

Weiß nur vom zuständigen Programmierer, dass ich mit meiner DB per LDAP - Ldif
Daten holen soll. Per LS Daten importieren usw. OK
aber per LDAP ->absolut NULL,KOMMA,NULL Ahnung.

Aber es heißt einfach -> Mach mal, das kriegst schon hin.
Natürlich ist die ganze Prozedur, wenns es tut der Hammer.
Aber bis dahin ist es noch ein sehr weiter Weg.

Gruß Jason
ohne zusätzliche Tools kannst Du mit LS keine LDAP-Anfrage machen. Das Stück Code, welches Du benötigst, steckt in der DLL.

Alternativ (unschöner) kannst Du mit ldapsearch (ruf es mal an einer MS-DOS Eingabeaufforderung auf) ein Ergebnis in eine Datei umleiten und dann die Datei mit Script auswerten.
Titel: Re: Per LS Daten von LDAP abholen
Beitrag von: flaite am 06.08.07 - 16:18:08
Lotus braucht sich nicht um eigene und möglicherweise fehlerbehaftete LDAP Routinen zu kümmern, wenn das windows-only als DLLs oder als Java sowieso schon für lau vorliegt.
Schwierig / Einfach sind sowieso subjektive und keine objektiven Kategorien. Es gibt auch unterschiedliche Arten von Schwierigkeit. Wenn Lotus jeden Enterprise Standard mit eigenem LotusScript Code unterstützte, würde das LotusScript als Sprache stark aufblähen. Und Leute, die sowieso mit Windows Programmierung (dlls) oder Java rumhantieren müßten alles doppelt lernen.

Titel: Re: Per LS Daten von LDAP abholen
Beitrag von: lotus blue am 10.08.07 - 08:23:53
Hi Leute,

habe mir mal Codes angeschaut und mit nem Tipp von Thomas Schulte (danke nochmals :-*) einfach mal rumprobiert.
Angemerkt sei, dass LS derzeit bei mir "noch" nicht richtig angekommen ist.
Der Grund-Kurs schafft hoffentlich Abhilfe.

Dennoch hoffe ich auf Hilfe, wo ich was komplett falsch codiert hab.

Es soll eine csv-Datei mit dem Namen test1.csv vom Laufwerk C: importiert werden. Die Datei enthält beliebig viele Infos über Nutzer.
Die Felder im csv sowie in der Maske "Main" lauten: sn, gn und l
Für jede Zeile soll ein neues Dok angelegt werden.

Hier der Code:
Sub Initialize
   Dim session As New notessession
   Dim db As notesdatabase
   Dim doc As notesdocument
   Dim fileNum As Integer, cells As Integer, k As Long
   Dim fileName As String
   Dim InputStr As String, delimiter As String
   Dim FieldArray As Variant
   
   If resp% = 6 Then     
      fileNum% = Freefile()
             fileName$ = "C:\test1.csv"
     
      delimiter = ","

      'Hier habe ich noch keine Ahnung
      cells = 14 + 1
      k = 0
      
      Open fileName$ For Input As fileNum%
      Do While Not Eof(fileNum%)
       
      Line Input #1,  InputStr$
         
              Print Cstr(k) + " Alle Nutzer wurden angelegt."
      Loop
      Close fileNum%
   Else
      Exit Sub
   End If
   
End Sub

Function CreateDocument(FieldArray As Variant) As Integer
   Dim session As New notessession
   Dim db As notesdatabase
   Set db = session.currentdatabase
   Dim doc As New notesdocument(db)
   
   doc.Form = "Main"
   doc.sn = FieldArray(1)
   doc.gn = FieldArray(2)
   doc.l = FieldArray(3)
   
   Call doc.save(1,0)
   
End Function

Titel: Re: Per LS CSV-Datei importieren bzw. per LDAP abholen
Beitrag von: Thomas Schulte am 10.08.07 - 15:22:26
Hier der Code:
Sub Initialize
   Dim session As New notessession
   Dim db As notesdatabase
   Dim doc As notesdocument
   Dim fileNum As Integer, cells As Integer, k As Long
   Dim fileName As String
   Dim InputStr As String, delimiter As String
   Dim FieldArray As Variant

Hier macht das Sinn und nicht da unten in der Createdocument Routine

   Set db = session.currentdatabase
   


Du erwartest hier eine Antwort auf eine Frage, doch wo ist die Frage???
   If resp% = 6 Then     

      fileNum% = Freefile()
             fileName$ = "C:\test1.csv"
     
      delimiter = ","

      'Hier habe ich noch keine Ahnung

ich auch nicht. cells verwendest du gar nicht und k nur für die Print Ausgabe, die in einem Background Agent nichts verloren hat. Also ersatzlos streichen

      cells = 14 + 1
      k = 0
      
      Open fileName$ For Input As fileNum%
      Do While Not Eof(fileNum%)
       
      Line Input #1,  InputStr$

Hier fehlt was Schließlich muss du dein FieldArray ja auch irgendwie füllen
         FieldArray = Split(InputStr$Text$,delimiter)
Und das hier fehlt auch Irgendwie solltest du deiner Createdocument Version ja schließlich auch mitteilen was du von ihr willst.
         call CreateDocument(db, FieldArray)
Und außerdem ergänzt du die Übergabe der db in Createdocument



Kann man machen, sollte man aber bei background agents nicht tun. denn erstens werden die langsamer und zweitens müllt diese Ausgabe dann das Logfile vom Server zu.
              Print Cstr(k) + " Alle Nutzer wurden angelegt."

      Loop
      Close fileNum%
   Else
      Exit Sub
   End If
   
End Sub

Eine Function ist nur dann ein Funktion wenn sie auch einen Wert zurückgibt. Das tut deine
Function CreateDocument(FieldArray As Variant) As Integer
nicht, also ist sie eine
Sub CreateDocument(db as notesdatabase, FieldArray As Variant)
und wenn wir schon dabei sind, das ist hier nicht notwendigerweise performance fördernd
Entweder deklarierst du das als Global und initialisierst die DB nur einmal.
oder du löscht das hier und übergibst die db an die Sub
   Dim session As New notessession
   Dim db As notesdatabase
   Set db = session.currentdatabase

   Dim doc As New notesdocument(db)
   
   doc.Form = "Main"
   doc.sn = FieldArray(1)
   doc.gn = FieldArray(2)
   doc.l = FieldArray(3)
   
   Call doc.save(1,0)

und logischerweise gibt es hier auch keine
End Function
sondern eine
End Sub

Titel: Re: Per LS CSV-Datei importieren bzw. per LDAP abholen
Beitrag von: lotus blue am 10.08.07 - 16:11:34
Danke. Werds am Montag versuchen.


Mann, ich muss noch so lange auf den Kurs warten :'(.
ABer vielleciht kann ich mich danach mal revanchieren  ;D (nur a Späßle)

Danke. Nun nerv ich Euch nicht mehr und wünsch ein schönes WE.
Titel: Re: Per LS CSV-Datei importieren bzw. per LDAP abholen
Beitrag von: lotus blue am 21.08.07 - 07:14:28
Hallöchen liebe Forumgemeinde.

Import der Datei tut, aber mit den zu füllenden Felder habe ich noch Probleme.
Iregendwie hab ich noch wo einen Fehler. Momentan übernimmt er alles bis auf die jeweils Ersten Werte (a).

Die CSV ist wie folgt aufgebaut:
a,b,c,d,
Mustermann,Berlin,1234,Dirk,
Test,Bern,1234,Michael,
usw.
zur Info (a=name,b=Standort,c=Durchwahl, d=Vorname)

und hier der Code:
Sub Initialize
   Dim session As New notessession
   Dim db As notesdatabase
   Dim doc As notesdocument
   Dim fileNum As Integer, cells As Integer, k As Long
   Dim fileName As String
   Dim InputStr As String, delimiter As String
   Dim FieldArray As Variant
   Set db = session.currentdatabase
   
   fileNum% = Freefile()
   
       ' Dateipfad
   fileName$ = "C:\test1.csv"
   
 ' Trennzeichen
   delimiter = ","
   
   Open fileName$ For Input As fileNum%
   Do While Not Eof(fileNum%)
      
  ' Zeile für Zeile einlesen
      Line Input #1,  InputStr$       
      FieldArray = Split(InputStr$,delimiter)
      Call CreateDocument(db, FieldArray)
      
   Loop
   Close fileNum%
   Exit Sub
   
End Sub

Sub CreateDocument(db As notesdatabase, FieldArray As Variant)
   Dim doc As New notesdocument(db)
   
   doc.Form = "Memo"
   doc.a = FieldArray(1)
   doc.b = FieldArray(2)
   doc.c = FieldArray(3)
   doc.d = FieldArray(4)
   
   
   Call doc.save(1,0)
   
End Sub
Titel: Re: Per LS CSV-Datei importieren bzw. per LDAP abholen
Beitrag von: DAU-in am 21.08.07 - 07:19:19
ääää

wenn du die Basis nicht explizit auf 1 gesetzt hast, beginnt der Array bei 0 zu zählen.
array(1) ist dann schon der zweite Wert.


grüsse

Dau-in
Titel: Re: Per LS CSV-Datei importieren bzw. per LDAP abholen
Beitrag von: lotus blue am 21.08.07 - 07:40:25
 O0 O0 >:D >:D O0 O0
Mann o Meter. Ja ist klar.
Danke

ääää

wenn du die Basis nicht explizit auf 1 gesetzt hast, beginnt der Array bei 0 zu zählen.
array(1) ist dann schon der zweite Wert.


grüsse

Dau-in
Titel: Re: Per LS CSV-Datei importieren bzw. per LDAP abholen
Beitrag von: lotus blue am 21.08.07 - 08:11:57
Grds. Frage mit jetzt fünf Werten (Feldern) funzt es.
Wenn es erweitert wird auf beispielsweise 8-12 Felder,
kommt der schöne "Subscrpit out of Range".

An was liegt das? ??? ::)
Titel: Re: Per LS CSV-Datei importieren bzw. per LDAP abholen
Beitrag von: Thomas Schulte am 21.08.07 - 08:22:53
Weil du dann auch überprüfen must wieviele Elemente dein Field Arra denn hat und nur genau so viele füllen darfst.
Titel: Re: Per LS CSV-Datei importieren bzw. per LDAP abholen
Beitrag von: eknori am 21.08.07 - 14:27:49
Zitat
Weiß jemand einen Rat?
Die CSV Datei so aufbauen, daß ein Delimiter verwendet wird, der nicht auch in den Daten vorkommt. Z.B ein ~
Titel: Re: Per LS CSV-Datei importieren bzw. per LDAP abholen
Beitrag von: lotus blue am 21.08.07 - 14:31:34
Zitat
Weiß jemand einen Rat?
Die CSV Datei so aufbauen, daß ein Delimiter verwendet wird, der nicht auch in den Daten vorkommt. Z.B ein ~

Danke. Da ist des berühmt berücktigte 10erl schon gefallen. Darum habe ich gleich den Beitrag wieder gelöscht. Leider zu spät. Da kam deine Hilfe schon.
Trotzdem Danke.
Titel: Re: Per LS CSV-Datei importieren
Beitrag von: lotus blue am 28.08.07 - 07:59:20
Hallo Jungens, :D

es wird, es wird. :)
Das Importieren funzt jetzt wie ne eins.
Nur gibt es noch ein kleines Prob, wo ich zwar tricksen kann, aber es dürfte noch einen anderen Weg geben.

In meiner CSV(Userverzeichnis) möchte ich den 1. Wert nicht importieren.
Wie mach ich das, ohne die CSV Dateien zu verändern?
Momentan sieht die erste CSV Zeile so aus:
DN,GN,SN usw.
DN alleine füllt mir aber alleine schon 5 Felder, da dort Username, ID usw, enthalten sind und mit dem jeweils verwendeten Delimeter getrennt sind.

UND

Die erste Zeile wird ja mit importiert. Lass ich die nur in den Ansichten nicht anzeigen oder gibt es da was anderes?

Gruß Jason   
Titel: Re: Per LS CSV-Datei importieren
Beitrag von: Thomas Schulte am 28.08.07 - 09:46:32
einfach die erste Teile lesen aber nicht verarbeiten:
 Open fileName$ For Input As fileNum%
Line Input #1,  InputStr$       

   Do While Not Eof(fileNum%)
     
  ' Zeile für Zeile einlesen
      Line Input #1,  InputStr$       
Titel: Re: Per LS CSV-Datei importieren
Beitrag von: lotus blue am 28.08.07 - 13:52:02
einfach die erste Teile lesen aber nicht verarbeiten:
 Open fileName$ For Input As fileNum%
Line Input #1,  InputStr$       

   Do While Not Eof(fileNum%)
     
  ' Zeile für Zeile einlesen
      Line Input #1,  InputStr$       

Perfekt. Jetzt tut es. Danke nochmals
Titel: Re: Per LS CSV-Datei importieren
Beitrag von: lotus blue am 10.09.07 - 11:12:43
Ich nochmal.
Import funktioniert wie ne Eins.
Nur das verarbeiten der Daten hängt noch.
Auch wenn Notes nicht schuld ist, hoffe ich auf Eure Hilfe.

Ich bekomm die csv Datei von nem Kollegen. Das Trennzeichen ist aber ein Riesenproblem.
Momentan wird die Datei mit ";" als Delimeter übermittelt.

Eine Zeile ist aufgebaut mit : Name;Vorname;Telefon;Zimmernummer; usw.
Hat ein Mitarbeiter jedoch zwei Telefonnummern ist die Datei folgendermaßen aufgebaut: Name;Vorname;"Telefon1;Telefon2";Zimmernummer.......
Und genau da liegt das Problem.
Dacht mir Anfangs, dann nimmst halt "," als Delimeter, aber plötzlich tritt das gleiche Problem bei zwei vorhandenen Zimmernummern auf. Diese sind mit , getrennt.
............"Zimmernummer1,Zimmernummer2",

Meine Frage: Kann ich da mit Notes irgendwas dagegen machen????? ???
Kenn mich mit dem Export bzw. erstellen von csv-Dateien nicht so aus.
Kann mein Kollege problemlos z.B. "$" als Trennzeichen vorgeben?

Hoffe es ist einigermaßen verständlich erklärt.

Viele Grüße Jason
 


 
Titel: Re: Per LS CSV-Datei importieren
Beitrag von: WernerMo am 10.09.07 - 11:27:22
Hallo,

das Problem ist wohl, dass die User in den genannten Feldern selber "Satzzeichen etc. als "Trenner" eingeben. Dann verwende ich gerne als Trennzeichen zwei mal Tilde "~~" oder einmal Pipe "|" unsere User benutzen diese Zeichen nicht in Feldern.

Oder dein Kollege prüft jedes Feld vor der Ausgabe und setzt "unerwünschte Zeichen um z.B. in einen Gedankenstrich".

Gruß Werner
Titel: Re: Per LS CSV-Datei importieren
Beitrag von: lotus blue am 10.09.07 - 11:49:31
Hallo,

das Problem ist wohl, dass die User in den genannten Feldern selber "Satzzeichen etc. als "Trenner" eingeben. Dann verwende ich gerne als Trennzeichen zwei mal Tilde "~~" oder einmal Pipe "|" unsere User benutzen diese Zeichen nicht in Feldern.

Oder dein Kollege prüft jedes Feld vor der Ausgabe und setzt "unerwünschte Zeichen um z.B. in einen Gedankenstrich".

Gruß Werner

OK. Dann werd ich das mal versuchen. Danke  8)
Titel: Re: Per LS CSV-Datei importieren
Beitrag von: lotus blue am 17.09.07 - 13:48:14
Sodala. Mal schnell beim Kollegen gewesen.

Hat zwar wenig jetzt mit Notes zu tun, hoffe aber trotzdem auf Eure Hilfe.

Er hat ein Tool (fragt mich bitte aber nicht was für eins 8)) mit dem er die LDAP-Datei in eine CSV umwandelt. Dort hat er lt. seiner Aussage "keine Möglichkeit" einen speziellen Trenner (so wie ich ihn benötige ~~) vorzugeben.

Gibt es da vielleicht andere Tools, bei denen diese Auswahl des Trenners möglich ist.
Hab mal gegoogelt, aber ohne Erfolg.

Mfg
Titel: Re: Per LS CSV-Datei importieren
Beitrag von: tks am 17.09.07 - 15:04:28
Wenn er eine CSV macht, dann gibt es doch einen Trenner. CSV = Comma separated value oder? Also müsstest Du eine Textdatei mit Kommas haben. Und die kannst Du doch per x-beliebigem Editor (zur Not notepad) mittels "Suchen & Ersetzen" in "~~" ändern.

Oder habe ich was falsch verstanden?
Titel: Re: Per LS CSV-Datei importieren
Beitrag von: WernerMo am 17.09.07 - 15:08:51
hallo,

aber das ist ja genau das Thema des Thread, dass die user auch im Feld Kommas verwendet haben und dann die Felder verhackstückt werden.

Gruß Werner
Titel: Re: Per LS CSV-Datei importieren
Beitrag von: koehlerbv am 17.09.07 - 15:13:09
So, wie das Beispiel aber aussieht, scheint die Ausgabe doch eindeutig zu sein: Mehrfachwerte stehen in Anführungszeichen. Und dann ist es ja ein ganz leichtes, diese zu erkennen und den Inhalt entsprechend zu verarbeiten. So ein ganz einfaches Parsileinichen  :)

Bernhard
Titel: Re: Per LS CSV-Datei importieren
Beitrag von: tks am 17.09.07 - 15:20:05
O.K. nur die Hälfte gelesen. Sorry.

Also wenn Kommas als Satzzeichen im Text vorkommen, habe ich mir bisher immer so beholfen (aber nur wenn man das nicht täglich machen muss):

1. Im Text stehen die Kommas i.d.R. vor einem Leerzeichen (also ,_). Also "Suchen & Ersetzen" von ,_ in z.B. #_. Die als Spaltentrenner gedachten Kommas bleiben damit stehen. Leider natürlich auch die Tippfehler der User.

2. Kommas durch gewünschtes Trennzeichen ersetzen (, in ~~).

3. Aus #_ wieder ,_.


Wenn die Werte immer mit " enden. ", durch "~~ ersetzen?
Titel: Re: Per LS CSV-Datei importieren
Beitrag von: lotus blue am 17.09.07 - 15:22:42
Hallo Leute,

grds. geht das ja mit Suchen/Ersetzen.
Aber das ist halt wieder ein Schritt mehr nach dem Export via LDAP.

Kenn mich wie bereits erwähnt in dem Bereich nicht so aus.
Habe mir nur vorgestellt, dass es dann vielleicht ein Tool gibt, wo man Dateien (LDAP) exportiert und dem Tool sagt: Paß auf als Trenner machst Du ~~ und es tut dann.

Ich importiere dann via LS die Daten und fertig ist das Ganze.
Titel: Re: Per LS CSV-Datei importieren
Beitrag von: lotus blue am 20.09.07 - 10:42:31
Keiner einen Tipp für so ein Tool::) ??? :-\ :-:
Titel: Re: Per LS CSV-Datei importieren
Beitrag von: koehlerbv am 20.09.07 - 10:44:48
Was fehlt Dir denn noch? Du musst doch nur zeilenweise analysieren und daraus Deine Felder befüllen.

Bernhard
Titel: Re: Per LS CSV-Datei importieren
Beitrag von: lotus blue am 20.09.07 - 10:56:04
Was fehlt Dir denn noch? Du musst doch nur zeilenweise analysieren und daraus Deine Felder befüllen.

Bernhard

Mir fehlt das Tool, das beim LDAP auslesen ~~als Trenner vorgibt

Mfg
Titel: Re: Per LS CSV-Datei importieren
Beitrag von: klaussal am 20.09.07 - 13:12:10
Es scheint das Tool entweder nicht zu geben oder keiner kennt so etwas  :'(
Titel: Re: Per LS CSV-Datei importieren
Beitrag von: m3 am 20.09.07 - 13:29:14
Ein anderes Tool einzusetzen, um LDAP direkt auszulesen hat Ulrich schon auf Seite 1 angeführt -- damit würde die ganze Diskussion um CSV-Parsen ein Ende haben.

Aber wenn das nicht verwendet werden kann ...

Wie wärs, wenn Du mal so eine "problematische" Zeile aus dem CSV-File hier postest, damit wir das Problem mal sehen?

Wenn es sich immer noch um Zeilen wie
Code
Name;Vorname;"Telefon1;Telefon2";Zimmernummer.......
handelt, ist die Lösung relativ einfach.
Vor dem Split alle ";" die zwischen zwei Anführungszeichen stehen, durch was anderes wie etwa "~~" ersetzen -- dann stolpert Split nicht mehr.



Titel: Re: Per LS CSV-Datei importieren
Beitrag von: lotus blue am 21.09.07 - 07:45:07
Hier ein Auzug aus meiner CSV-Datei die ca. 1800 Zeilen enthält und "," als Trenner hat.
Erste Zeile: DN,sn,l,telephoneNumber,gn,mail,roomNumber,org8,org7,org6
so sieht der normal Fall aus:
cn=Test User 12345678,ou=Users,ou=Firma,o=Europäische,c=DE,Test,Berlin,+49 030 12 3456,User,test.user@ep.de,1234,Angestellter,Referat Organisation,Verwaltung

Hier mal Daten die beim Feld org7 mit "" getrennt sind, da die Kollegin für 2 Abteilungen zuständig ist:

cn=Mustermann Renate 10111,ou=Users,ou=Firma,o=Europäische,c=DE,Mustermann,Düsseldorf,+49 123456,Renate,renate.mustermann@ep.de,1234,Bankkauffrau,"Verwaltung,Controlling",Personalabteilung

Und hier ein Fall mit 2 Sonderfällen einmal ";" und "" als zusätzlichem Trenner, weil der Kollege 2 Telfonnummern, 2 Zimmernummer hat und für 3 Abteilungen zuständig ist:
cn=König Ralf 11111,ou=Users,ou=Firma,o=Europäische,c=DE,König,Stuttgart,+49 123456;+49 1234577,Ralf,,123;588,Angestellter,"Referat 1, 2, 3",Kreditabteilung

Das ist der Code dazu:

Sub Initialize
   Dim session As New notessession
   Dim db As notesdatabase
   Dim doc As notesdocument
   Dim fileNum As Integer, cells As Integer, k As Long
   Dim fileName As String
   Dim InputStr As String, delimiter As String
   Dim FieldArray As Variant
   Set db = session.currentdatabase
   
   fileNum% = Freefile()
   
       ' Dateipfad
   fileName$ = "H:\kommatest.csv"
   
 ' Trennzeichen
   delimiter = ","
   
   Open fileName$ For Input As fileNum%
   Line Input #1,  InputStr$    
   Do While Not Eof(fileNum%)
     ' Zeile für Zeile einlesen
      Line Input #1,  InputStr$ 
      FieldArray = Split(InputStr$,delimiter)
      Call CreateDocument(db, FieldArray)
      
   Loop
   Close fileNum%
   Exit Sub
   
End Sub

Sub CreateDocument(db As notesdatabase, FieldArray As Variant)
   Dim doc As New notesdocument(db)
   
   doc.Form = "Main"
   doc.DN = FieldArray(0)
   doc.DN1 = FieldArray(1)
   doc.DN2 = FieldArray(2)
   doc.DN3 = FieldArray(3)
   doc.DN4 = FieldArray(4)
   doc.sn = FieldArray(5)
   doc.l = FieldArray(6)
   doc.telephoneNumber = FieldArray(7)
   doc.gn = FieldArray(8)
   doc.mail = FieldArray(9)
   doc.roomNumber = FieldArray(10)
   doc.org8 = FieldArray(11)
   doc.org7 = FieldArray(12)
   doc.org6 = FieldArray(13)
   
   
   Call doc.save(1,0)
   
End Sub
Titel: Re: Per LS CSV-Datei importieren
Beitrag von: koehlerbv am 21.09.07 - 10:22:28
Das ist doch ordentlich und sauber getrennt ... Nur nicht schön (weil nicht immer Anführungszeichen verwendet werden bei Mehrfachwerten)..

Die Lösung ist doch einfach:
- zeilenweise einlesen
Die Zeile Zeichen für Zeichen auseinanderflöhen:
- Lesen bis zum nächsten Komma
- Wenn ein Anführungszeichen kommt, nichts mehr auswerten bis zum nächsten Anführungszeichen
- Den erhaltenen Teilstring analysieren:
  - In Anführungszeichen? Anführungszeichen entfernen, Split mit Komma
  - Keine Anführungszeichen? Split mit Semikolon

Bernhard
Titel: Re: Per LS CSV-Datei importieren
Beitrag von: klaussal am 21.09.07 - 10:27:31
Vielleicht hilft ja dieses Stückchen Code:

Code
   ' "," aus dem zu konvertierenden Text entfernen
	char = ""
	varvalnew = ""
	If Instr(1, varval, ",") <> 0 Then
		For x = 1 To Len(varval)
			char = Mid(varval, x, 1)
			If char <> "," Then varvalnew = varvalnew + char
		Next
		varval = varvalnew
	End If
Titel: Re: Per LS CSV-Datei importieren
Beitrag von: koehlerbv am 21.09.07 - 10:30:46
Eher nicht. Das verwirrt nur. Ist auch schlechter Code. Und verwendet nicht den richtigen Stringconcatenator.

Bernhard
Titel: Re: Per LS CSV-Datei importieren
Beitrag von: klaussal am 21.09.07 - 10:33:55
Der stammt ja auch nicht von mir  ;D

Mit ein bisschen Abwandlung kam man den schon nehmen, um sich byteweise durch die Felder zu hangeln.
Titel: Re: Per LS CSV-Datei importieren
Beitrag von: Thomas Schulte am 21.09.07 - 10:41:34
Außerdem brauchts den ganzen Zirkus doch nicht. Wenn man anstelle des Line Input bei dieser Geschichte und unter diesen Voraussetzungen das stinknormale Input # benutzt dann kann man sich die Parserei sparen.

Auszug aus der Online Hilfe:
Syntax
Input #fileNumber , variableList
Elements
fileNumber

The number assigned to the file when you opened it. A pound sign (#) sign must precede the file number.

variableList

A list of variables, separated by commas. The data read from the file is assigned to these variables. File data and its data types must match these variables and their data types.
variableList cannot include arrays, lists, variables of a user-defined data type, or object reference variables. It can include individual array elements, list elements, and members of a user-defined data type or user-defined class.

Und ein wenig weiter unten .....

String variable   

The next non-space character in the file is assumed to begin a string. Note these special conditions:
If that character is a double quotation mark ("), it is ignored; however, all characters following it (including commas, spaces, and newline characters) up to the next double quotation mark are read into the string variable.
If the first character is not a double quotation mark, the next space, comma, or end-of-line character ends the string.
Blank lines are translated to the empty string ("").
Note that tab is a non-space character.
Titel: Re: Per LS CSV-Datei importieren
Beitrag von: koehlerbv am 21.09.07 - 10:50:32
Das setzt aber solch ein Format voraus, Thomas:
"value1","value" etc.
Ansonsten sind neben dem Komma auch Leerzeichen Delimiter. Ungut.
Mehrfachwerte lassen sich so auch nicht in Arrays umwandeln. Aber das ist vielleicht gar nicht gefragt.

Bernhard
Titel: Re: Per LS CSV-Datei importieren
Beitrag von: Thomas Schulte am 21.09.07 - 11:04:55
Bernhard. Dieses Format kann man in der Regel locker bei der Übergabe erzwingen. Zumindest bei allen Export Tools die ich kenne.

Damit fällt der erste Punkt schon mal weg.

Und wenn man das nicht kann, was hindert einen denn daran das File zweimal zu lesen.

Beim ersten mal  mit einem Line Input und einem Replace von allem was als trenner erkannt werden kann durch ein, normalerweise, nicht vorkommendes Zeichen (auch das könnte man absichern), Anschließendes Schreiben in dieselbe Datei. Oder wenn es denn sein muss in eine andere.
Danach dieselbe geänderte oder die neu erstellte Datei öffnen und dann das zweite mal mit dem input #  drübergehen um das strukturiert reinzubekommen.
Titel: Re: Per LS CSV-Datei importieren
Beitrag von: koehlerbv am 21.09.07 - 11:16:43
Thomas, über das Exporttool mache ich mir jetzt mal keine Gedanken - der Thread wäre dann ja nicht mehr notwendig. Und im vorhandenen Format einzulesen oder ein anderes Tool zu suchen erscheint mir gleich aufwändig.

Wenn Du alle möglichen Trennzeichen durch - sagen wir ¶ - ersetzt, dann hast Du ja die Struktur vollkommen zerlegt. Derzeit ist das Semikolon gar kein Problem - Trennzeichen ist ja das Komma. Das kommt aber auch als Multivalue-Trenner innerhalb eines Wertes vor - wenn dieser in Anführungszeichen steht.

So lange, wie jetzt hier schon debattiert wurde, kostet das Schreiben einer Routine, die mit dieser doch einfachen Struktur klarkommt, bestimmt nicht.

Bernhard