Autor Thema: Import CSV  (Gelesen 3562 mal)

Offline mic

  • Frischling
  • *
  • Beiträge: 3
  • Geschlecht: Männlich
Import CSV
« am: 31.07.13 - 09:18:48 »
Hallo zusammen,

erst einmal vielen Dank für das tolle Forum. Es hat mir schon mehrfach sehr geholfen wenn der Knoten im Kopf nicht weggehen wollte.
Jetzt Versuche ich mich erstmals an einer Agenten Programmierung mit LS, der mir aus einer CSV Datei Adressen Importieren soll.
In der Sandbox bin ich fündig geworden und habe folgendes Script angepasst:
Code
Option Public
Sub Initialize
     Dim session As New notessession
     Dim db As notesdatabase
     Dim doc As notesdocument
     Dim fileNum As Integer, cells As Integer, k As Integer
     Dim fileName As String
     Dim InputStr As String, delimiter As String
     Dim FieldArray As Variant
     
     fileNum% = Freefile()
     fileName$ = "C:\Users\...\Desktop\Adressen.csv" ' Location of your file
     delimiter = ";" ' Delimiter of your file
     cells = 43 ' How many cells + 1
     k = 0
     
     Open fileName$ For Input As fileNum%
     Do While Not Eof(fileNum%)
          Line Input #1,  InputStr$ 
          FieldArray = parseall(InputStr$, delimiter, cells)
          response% = CreateDocument(FieldArray)
          k = k + 1
          Print "Document Created: " + Cstr(k)
     Loop
     Close fileNum%
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)

		If FieldArray(30)<> "" and FieldArray(31) <> "" Then
		   doc.Type = "Company"
		else
		   doc.Type = "Person"
		End if
		doc.Title = FieldArray(29)
		doc.FirstName = FieldArray(30)
		'doc.MiddleIntial = FieldArray(3)
		doc.LastName = FieldArray(31)
		doc.Suffix = FieldArray(1)
		doc.CompanyName = FieldArray(4) + " " + FieldArray(5)
		doc.Depatment = FieldArray(33)
		'doc.SametimeLogin = FieldArray(8)
		doc.JobTitel = FieldArray(32)
		doc.OfficeStreetAddress = FieldArray(12)
		doc.OfficeCity = FieldArray(15)
		'doc.OfficeState = FieldArray(12)
		doc.OfficeZip = FieldArray(14)
		doc.OfficeCountry = FieldArray(13)
		'doc.StreetAddress = FieldArray(15)
		'doc.City = FieldArray(16)
		'doc.State = FieldArray(17)
		'doc.Zip = FieldArray(18)
		'doc.Country = FieldArray(19)
		doc.OtherStreetAddress = FieldArray(7)
		doc.OtherCity = FieldArray(10)
		'doc.OtherState = FieldArray(22)
		doc.OtherZip = FieldArray(9)
		doc.OtherCountry = FieldArray(8)
		'doc.PhoneNumber_8 = FieldArray(25)
		doc.OfficeFaxPhoneNumber = FieldArray(18)
		doc.OfficePhoneNumber = FieldArray(17)
		doc.PhoneNumber_9 = FieldArray(36)
		doc.HomeFaxPhoneNumber = FieldArray(37)
		doc.PhoneNumber = FieldArray(39)
		'doc.PhoneNumber_10 = FieldArray(31)
		doc.CellPhoneNumber = FieldArray(19)
		doc.PersPager = FieldArray(38)
		doc.PhoneNumber_6 = FieldArray(40)
		'doc.Anniversary = FieldArray(35)
		'doc.Manager = FieldArray(36)
		'doc.Assistant = FieldArray(37)
		doc.Birthday = FieldArray(42)
		doc.Categories = FieldArray(24)
		'doc.Children = FieldArray(40)
		'doc. = FieldArray(41)
		doc.email_1 = FieldArray(20)
		'doc.miscPhone1 = FieldArray(43)
		'doc.miscPhone2 = FieldArray(44)
		doc.miscPhone3 = FieldArray(41)
		'doc.email_2 = FieldArray(46)
		'doc.Location = FieldArray(47)
		'doc.Comment = FieldArray(48)
		'doc.Spouse = FieldArray(49)
		doc.WebSite = FieldArray(21)
		'doc.Blogsite = FieldArray(51)
	
	Call doc.save(1,0)
End Function

Function parseall(Initialstr As String, delimiter As String, cells As Integer) As Variant
     CRcr$ = Chr(13)
     IniVar$ = initialstr
     numchars = Len(IniVar$)
     Redim cols(cells)
     Redim coldata(cells)
     cols (0) = 0
     For numcol = 1 To cells
          prevcol = cols(numcol -1 )
          cols (numcol) = Instr (cols(numcol - 1) + 1, IniVar$, Delimiter$)
          StartCol = Cols(numcol - 1) + 1
          If Cols (numcol) = 0 Then
               endcol = numchar + 1
          Else
               endcol = cols(numcol)
          End If
          FieldLenght = EndCol - StartCol
          If FieldLenght <= 0 Then 
               FieldLenght = 50
          End If
          ColData(numcol) = Trim$(Mid$(IniVar$, StartCol, FieldLenght))
          CRPos% = Instr (1, ColData(numcol), CRcr$)     
          If (CRPos% >= 1) And (numcol <=2) Then
               TempStr$ = ColData(numcol)
               ColData(numcol) = Trim$(Mid$(IniVar$, StartCol, CRPos%-1))
          End If
          If cols (numcol) = 0 Then Exit For     
     Next
     parseall = coldata()
End Function

Mein Problem ist, dass er die csv komisch einliest...
Hab mal ein Bild angehängt.

Irgendwie scheint es so, dass er die Trenner (in meinem Fall Semikolon) nicht richtig umsetzt...
Hat einer eine Idee?

Vielen Danke für eure Mühe

Michael
« Letzte Änderung: 06.08.13 - 08:24:35 von mic »

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Import CSV
« Antwort #1 am: 31.07.13 - 09:42:31 »
Hast du dir das Ganze mal im Debugger angeschaut? Insbesondere die Funktion parseall. Hier vermute ich liegt der Hund begraben.

Axel
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline tabama

  • Aktives Mitglied
  • ***
  • Beiträge: 233
  • Geschlecht: Männlich
  • hier werden Sie geholfen
Re: Import CSV
« Antwort #2 am: 31.07.13 - 12:05:02 »
Hallo,

ich nehme hierfür immer "Line Input" und "Split" Das ist zwar nicht so flexibel wie das aus der Sandbox, dafür weiß ich aber genau was abläuft.

Der Grobe Ablauf ist:
Die CSV (oder andere Text-Datei) mit "Line Input" Zeile für Zeile durchlaufen.
Die einzelnen Zeilen mit "Split" in die einzelen Feldern in ein arry aufbröseln und dann die Notes-Felder aus dem Array füllen.
Beim Split kann man ein Zeichen (z.B. ";") erfassen, aber auch mit Chr(9) eine TAB-Datei trennen.


Offline mic

  • Frischling
  • *
  • Beiträge: 3
  • Geschlecht: Männlich
Import CSV
« Antwort #3 am: 06.08.13 - 09:30:20 »
Hallo,

OK und wie machst du das dann mit dem "Split"?
Hast du ggf. ein Beispiel?
Werd auch nochmal das Entwicklerhandbuch zu rate ziehen...

Besten Dank schon mal...

Michael

Offline pimpfling

  • Senior Mitglied
  • ****
  • Beiträge: 367
  • Geschlecht: Männlich
Re: Import CSV
« Antwort #4 am: 06.08.13 - 10:22:57 »
Aus der Hilfe:

Sub Initialize
   Dim ret As Variant
   dim teststr as string
   Dim delim As String
   teststr = "This is the Connection"
   delim = " "
   ret = split(teststr, delim)
   For x = 0 to 3
      Print ret(x)
   Next
End Sub
'OUTPUT
'This
'is
'the
'Connection
Gruß Stefan

----------------------------------
EDV-Systeme verarbeiten, womit sie gefüttert werden. Kommt Mist rein, kommt Mist raus.

Offline Mirko

  • Junior Mitglied
  • **
  • Beiträge: 57
  • Geschlecht: Männlich
Re: Import CSV
« Antwort #5 am: 06.08.13 - 16:44:22 »
Hallo,
ich habe es mal schnell getestet: Das Problem scheint darin zu liegen, dass nicht alle Felder belegt sind. Dann sind mehrere Trennzeichen (";") direkt hintereinander in dem zu teilenden String. Damit ist die "Parser-Funktion" offensichtlich überfordert.

Gruß Mirko

Offline Bastel123

  • Senior Mitglied
  • ****
  • Beiträge: 355
  • Geschlecht: Männlich
Re: Import CSV
« Antwort #6 am: 06.08.13 - 16:53:09 »
Ich habe noch keinen Ärger mit dem "split" gehabt. Auch nicht wenn z.B. 5 Felder hintereinander leer waren.
Sind die Daten denn "sauber", d.h. kommt der Trenner nicht irgend wo im Text vor?

Sebastian
Gruß Sebastian
-----------------------------------------------------
Kaum macht man's richtig, schon funktioniert's.

Offline mic

  • Frischling
  • *
  • Beiträge: 3
  • Geschlecht: Männlich
Import CSV
« Antwort #7 am: 07.08.13 - 16:18:53 »
Hallo zusammen,

erstmal danke euch allen für eure Mühen...
Habs gefunden...

In Parseall sag ich, wenn das Feld 0 oder kleiner ist soll er es fest mit 50 Zeichen füllen...

Code
If FieldLenght <= 0 Then 
   FieldLenght = 50
End If

So ist es besser.

Code
If FieldLenght <= 0 Then 
   FieldLenght = 0
End If

Wenn der Fall auftritt, dass ";;" kommt hab ich dazwischen nun mal keine Stelle
und das Feld soll leer bleiben.

Was meint Ihr???
Funktionieren tut es...

MFG
Michael

Offline Mirko

  • Junior Mitglied
  • **
  • Beiträge: 57
  • Geschlecht: Männlich
Re: Import CSV
« Antwort #8 am: 08.08.13 - 09:41:39 »
Hallo Michael,
ich würde trotzdem "split" nehmen. Stefan hat weiter oben ein Beispiel gezeigt. Das funktioniert auf alle Fälle sicher, auch leere Felder werden ordentlich behandelt. Sieh Dir das Beispiel mal genauer an, das ist nicht schwer und klappt. Du musst natürlich als Delimiter ein Semikolon nehmen ;-)

Gruß Mirko

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz