Autor Thema: CSV-Datei importieren  (Gelesen 5364 mal)

Offline Legolas

  • Senior Mitglied
  • ****
  • Beiträge: 446
  • Geschlecht: Männlich
CSV-Datei importieren
« am: 16.12.14 - 14:32:34 »
Hallo Forum,

hat vielleicht von Euch schon sowas programmiert:

Ich bin auf der Suche nach einer Script Bibliothek mit der ich eine CSV Datei auslesen kann um diese in Notes zu importieren.
Auf den ersten Blick ist das „PillePalle“.  Es gibt genügend Beispiele im Netz. Nur….

Die CSV Datei beinhaltet auch Kommentar Felder, die evtl. den Delimiter sowie Zeilenumbrüche beinhalten können. MS-EXCEL importiert die Datei bei Doppelklick darauf problemlos! (Wer hätte das gedacht!)

Eine Beispieldatei hängt dran. (Bitte von .TXT nach .CSV umbenennen)

Code
Datum;Zeit;Name;Email;Kommentar;Alter;Betrag
13.05.2010;08:22:12;Susi;susi.sorglos@gmx.de;“Hallo Text“;18;100
12.01.2014; 09:41:14;Peter;peter.panik@gmx.de;“Hier kommt der; Kommentar mit einem
Zeilenumbruch und
noch einer und nun kommt das Ende“;29;10000
25.11.2010;14:22:22;Willy;willy.wucher@gmx.de;“Hallo Text“;33;999


Systemumgebung:
Notes 9.0.1
MS-EXCEL 2013


Grüße
Bernd
Arbeite klug, nicht hart.

Offline Bastel123

  • Senior Mitglied
  • ****
  • Beiträge: 355
  • Geschlecht: Männlich
Re: CSV-Datei importieren
« Antwort #1 am: 16.12.14 - 21:00:13 »
Hallo,

Schreib dir ein Makro, welches die Semikolonos in einer anderen Zelle in ein garantiert nicht vorkommnendes Zeichen übersetzt. Diese Zelle exportierst Du dann statt der Ursprungszelle.

"Hier kommt der;  Kommentar mit einem Zeilenumbruch" .... wird dann zu "Hier kommt der~ Kommentar mit einem Zeilenumbruch"....

Das kannst du dann in Notes z. B. @ReplaceSubstring wieder zurückübersetzen.

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

Offline Legolas

  • Senior Mitglied
  • ****
  • Beiträge: 446
  • Geschlecht: Männlich
Re: CSV-Datei importieren
« Antwort #2 am: 17.12.14 - 08:48:12 »
Hallo Sebastian,

Danke für die Rückmeldung.
Was ich zu muss ist mir schon klar. Ich hatte aber gehofft, dass sich vieleicht schon mal jemand mit dem Problem auseinander gesetzt hat und eine Lösung anbieten kann.

Ich habe hier nun meine eigene Lösung programmiert:
Im Beispielcode wird die Datei konvertiert, so dass in jeder Zeile ein pe Semikolon getrennter kompletter Datensatz steht.
Das Einlesen und Verarbeiten dieser Datei (Y:\Output.csv) sollt dann kein Problem mehr sein.
Beispiel zum Einlesen dieser Datei gibt es einige im Web.

Grüße
Bernd

Code
Option Public
Option Declare

Sub Initialize
	On Error Goto errhandler
	
	Dim filename As String	
	Dim filename2 As String
	Dim filenum As Integer
	Dim filenum2 As Integer
	Dim txt As String
	Dim txt2 As string
	Dim zwerg As String
	Dim pos1 As Integer
	Dim pos2 As Integer
	Dim anzDel As Integer
	Dim maxDel As Integer
	Dim a As integer
	Dim rowCount As Integer
	
	fileName = "Y:\input.csv" 
	fileName2 = "Y:\output.csv"

	filenum = FreeFile()
	Open fileName For Input As filenum
	
	filenum2 = FreeFile()
	Open fileName2 For Output As filenum2


	Do While Not EOF(fileNum)
		Line Input #fileNum, txt

		If rowCount = 0 Then
			'// Titlelzeile extrahieren um die Anzahl der Einnträge zu bestimmen
			Dim titleArray As Variant
			titleArray = C_Explode(txt, ";")
			maxDel = UBound(titleArray)
			rowCount = 1	
		End if

nochmal:
		anzDel = C_Get_SemiNo(txt)
		If anzDel <> maxDel then 
			For a = 1 To Len(txt)
				If Mid$(txt, a, 1) = ";" Then
					anzDel = anzDel + 1
				End If
				
				'Ist es evtl. ein Kommentarfeld?
				If Mid$(txt, a, 2) = {;"} Then
					pos1 = InStr(txt, {;"})
					pos2 = InStr(pos1, txt, {";})
					'Kommentar
					If pos2 > pos1 Then
						'Der abschließende Delimiter für den Komentar befindet sich in der gleichen Zeile.
						'Sonderzeichen im Kommentar entfernen
						zwerg = Mid$(txt, pos1+1, pos2-pos1)
						zwerg = C_ReplaceSubstring(zwerg, {"}, "")
						zwerg = C_ReplaceSubstring(zwerg, {;}, " ")
						txt = Left$(txt, pos1) + zwerg + Mid$(txt, pos2+1, Len(txt)-pos2)

						If InStr(txt, {;"}) > 0 Then 
							GoTo nochmal
						Else
							If C_Get_SemiNo(txt) <> maxDel Then
								Line Input #fileNum, txt2
								txt = txt + " " +txt2 
								GoTo nochmal
							Else
								Exit For
							End If
						End if
					Else
						'Kein End-Kommentarzeichen in der aktuellen Zeile gefunden --> nächste Zeile einlesen
						Line Input #fileNum, txt2
						txt = txt +" " + txt2 
						GoTo nochmal
					End If				
				End If			
			Next
		End if
		
		print #fileNum2, txt
	Loop	

	Close filenum
	Close filenum2
     
	Exit Sub

errhandler:
	MsgBox "Fehler: " & Error & " (" & Err &  ") in Zeile: " & Erl , 64, "Hinweis!"
	Exit Sub
End Sub


Function C_Get_SemiNo(txt) As Integer
	On Error GoTo errhandler

	Dim a As Integer
	Dim lauf As Integer
	
	For a = 1 To Len(txt)
		If Mid$(txt, a, 1) = ";" Then
			If Mid$(txt, a, 2) = {;"} Then 
				Exit Function
			End if
			lauf = lauf + 1
		End If
	Next
	C_Get_SemiNo = lauf

	Exit Function

errhandler:
 	MsgBox "Fehler in C_Get_SemiNo()    Error: " & Error & " (" & Err &  ") in Zeile: " & Erl , 64, "Hinweis!"
	Exit Function
End Function
« Letzte Änderung: 17.12.14 - 08:51:01 von Legolas »
Arbeite klug, nicht hart.

Offline petra.mint

  • Frischling
  • *
  • Beiträge: 11
  • Geschlecht: Weiblich
Re: CSV-Datei importieren
« Antwort #3 am: 17.12.14 - 12:25:01 »
Hallo Sohn von Thranduil!

Mal ein ganz "blöder Code", den ich ausgegraben habe (muss ick mal im Jumm geschrieben haben)...
Die Anzahl der Felder aus "If UBound(ret) >= 6 Then" sollte natürlich entsprechend angepasst werden auf die Gesamtzahl der Felder im Datensatz (denke, die beigefügte Datei ist nur ein Beispiel).
Es wird also geprüft, ob die jeweilige Zeile mit dem Muster (hier: Datum-/Zahlenformat) aus "LIKE" übereinstimmt - dann ist es eine neue Zeile. Der folgende Rest gehört dann eben mit dazu.

Code
Sub Initialize
	Print Date$ + " " + Time$
	fileNum = FreeFile()
	Open "h:\temp\test.csv" For Input As fileNum
	Do While Not EOF(fileNum)
		Line Input #fileNum, txt
		ret = Split(txt,";")
		If ret(0) Like "##.##.####" Then
			data = txt
		Else
			data = data + txt
		End If
		ret = Split(data,";")
		If UBound(ret) >= 6 Then
			Print data
		End If
	Loop
End Sub

Vielleicht klappt es ja auch so - vielleicht aber auch nur ein Ansatz...?!
« Letzte Änderung: 17.12.14 - 12:29:18 von petra.mint »
Liebe Grüße
Petra

Offline rambrand

  • Senior Mitglied
  • ****
  • Beiträge: 469
  • Geschlecht: Männlich
Re: CSV-Datei importieren
« Antwort #4 am: 17.12.14 - 14:41:52 »
Hallo Petra,
das war auch erst meine Idee. Aber da kam dann der Satz mit dem Kommentar mit Zeilenumbrüchen.
Mit Line Input liest Du zeilenweise ein.
In Bernds CSV bedeutet aber nicht 1 Zeile = 1 Datensatz.
Daher muss er schon etwas umständlicher vorgehen und erst in Erfahrung bringen, wieviele Spalten gibt es überhaupt und dann versuchen über das Zeilenende hinweg die noch fehlenden Daten miteinzulesen, bis er das wirkliche Ende des Datensatzes gefunden hat.

Die CSV ist halt auch etwas speziell, weil sie die Formatierung eines Textfeldes beinhaltet. Wenn das nicht der Fall wäre, dann würde der Line Input funktionieren.

Nur ich glaube, wenn es so einfach gewesen wäre, hätte Bernd nicht nach einer schon vorhandenen Lösung gefragt :-)

Bye,
Markus
Domino/Notes ab 4.6 aktuell 10.1FP3
Traveler 10.0.1FP1
PHP-Entwickler
Domino/Notes-Entwickler (Hobby)
Consultant (Informationssicherheit & Datenschutz)

Offline petra.mint

  • Frischling
  • *
  • Beiträge: 11
  • Geschlecht: Weiblich
Re: CSV-Datei importieren
« Antwort #5 am: 17.12.14 - 14:50:05 »
Hallo Markus!

Zitat
In Bernds CSV bedeutet aber nicht 1 Zeile = 1 Datensatz.
Eben drum wird ja auch der "nicht gültige Zeilenanfang" als "Zeilenrest" gewertet und dem Datensatz zuvor angehangen!
Klar, die Feldlänge sollte schon feststehen (immer n Felder) und der Zeilenbeginn klar definiert sein wie z. B. hier ein Datum.
Wie schon im Beitrag zuvor gesagt: Das Script habe ich mal irgendwann zusammenjebaut und nun aus den Tiefen meiner Code-Schnipsel-Handtasche jekramt...
War nur 'ne Idee von mir Sabbelkopp...
Liebe Grüße
Petra

Offline rambrand

  • Senior Mitglied
  • ****
  • Beiträge: 469
  • Geschlecht: Männlich
Re: CSV-Datei importieren
« Antwort #6 am: 17.12.14 - 15:18:46 »
Hallo Petra,

war ja auch nicht bös gemeint :-)

Wozu sonst gibt es Brainstorming, wo jeder seine Ideen reinwirft?
Die Idee einfach den Anfang eines Datensatz abzufangen ist ja auch nicht schlecht.
Wollte Deine Idee in keinster Weise abwerten.

Bye,
Markus
Domino/Notes ab 4.6 aktuell 10.1FP3
Traveler 10.0.1FP1
PHP-Entwickler
Domino/Notes-Entwickler (Hobby)
Consultant (Informationssicherheit & Datenschutz)

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.883
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Re: CSV-Datei importieren
« Antwort #7 am: 17.12.14 - 16:48:50 »
Die Frage, die ich mir hier stelle: Sind die "internen" Zeilenumbrüche unter Umständen nur Chr(10) und die "normalen" Zeilenumbrüche Chr(10) + Chr(13)? Weil dann liesse ich das ganze ja recht einfach realisieren... z.B. Notepad++ kann anzeigen, wie die Zeilen umgebrochen sind...
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline petra.mint

  • Frischling
  • *
  • Beiträge: 11
  • Geschlecht: Weiblich
Re: CSV-Datei importieren
« Antwort #8 am: 17.12.14 - 18:47:28 »
@Markus
war ja auch nicht bös gemeint :-)

Allet paletti - hab' ick so auch nicht aufjefasst!
Liebe Grüße
Petra

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz