Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Importieren einer .csv Liste in Access

Begonnen von Anke_71, Juli 25, 2010, 15:30:39

⏪ vorheriges - nächstes ⏩

Anke_71

Hallo, mal wieder ein Hilfegesuch:

Ich habe folgende unstrukturierte .csv Liste; Separator: # die Reihenfolge und die Kennzeichnungsbegriffe (Name:, Tel: usw) der einzelnen Zellen sind immer gleich, aber es sind nicht in jeder Zeile alle Inhalte vorhanden (Zeile 1: Telefon fehlt usw). Leere Spalten sind nicht durch doppelte Separatoren gekennzeichnet.

#Name:abc#Strasse:xyz#Fax:001#Email:Test
#Name:aaa#Telefon:0002#Email:Test1
#Name:bbb#Telefon:9393#Fax:9348

Gewünschtes Ergebnis in Access:
Name   Strasse  Telefon  Fax   Email
abc       xyz                      001  test
aaa                     0002             Test1
bbb                     9393     9348

a) Gibt es eine Möglichkeit, diese Liste in korrekter Tabellenstruktur in Access einzulesen?
b) Alternativ kann ich je eine ganze Zeile in ein Memo Feld importieren, dann müsste ich aus dem Memo-Feld heraus allerdings noch die korrekte Tabellenstruktur herstellen zB über Tabellenerstellungsabfrage - aber wie kann ich die richtigen Inhalte der richtigen Spalte zuweisen? Man könnte den Inhalt zwischen "#Name:" .... und dem nächsten Separator "#" in eine neue Spalte auslesen usw. Weiss jemand, wie man das in SQL ausdrückt?

VBA kann ich leider nicht - fällt jemand eine Lösung mit SQL oder Access Abfrage ein?

Nachtrag mit Lösungsidee:

Text wurde als Memofeld importiert; Jetzt möchte ich den Bereich "Strasse:xyz" ausschneiden und in eigenem Feld darstellen:

Memofeld sieht folgendermaßen aus:
#Name:abc#Strasse:xyz#Fax:001#Email:Test#usw.

Folgende Formulierung gibt mir 400 Zeichen ab "#Strasse" wieder
Teil([Tabelle.Feld];InStr(1;[Tabelle.Feld];"#Strasse";1);400)  --> Memofeld: #Strasse:xyz#Fax:001#Email:Test#usw.

Folgende Formulierung löscht alle Inhalte rechts vom darauffolgenden #
Teil([Tabelle.Feld];1;InStr(1;[Tabelle.Feld];"#";1)) --> Memofeld: #Strasse:xyz#

Problem: wie kriege ich das in eine kombinierte Formel, so dass ich nicht zwei aufeindanderfolgende Abfragen laufen lassen muss?
Das Ergebnisfeld sollte optimalerweise wie folgt aussehen:

"Strasse:xyz"


Viele Grüße
Anke

database

#1
Hallo,

Zitatfolgende unstrukturierte .csv Liste
...unstrukturiert ist schon mal gar nicht gut! :(
ZitatKennzeichnungsbegriffe (Name:, Tel: usw) der einzelnen Zellen sind immer gleich
Nein, sind sie eben nicht, da - wie du folgend richtig beschreibst - die leeren Spalten fehlen. :'(
ZitatLeere Spalten sind nicht durch doppelte Separatoren gekennzeichnet.
...und der Ersteller dieses Datenchaos - was meint der zum Vorschlag die *.csv neu zu erstellen und zwar so, dass man damit auch vernünftig arbeiten kann? ::)

Dein Einsatz um die Sache in Ehren aber ...

ZitatDas Ergebnisfeld sollte optimalerweise wie folgt aussehen:
"Strasse:xyz"
...damit hast du mit diesem Ergebnis eigentlich nichts erreicht ausser dass das # vor Strasse wegfällt.
m.E. sollte der Wert xyz in eine Tabelle wandern und zwar ins Feld Strasse, was aber mit deiner Methodik sicher nicht zu bewerkstelligen ist.

Vielleicht ließe sich das Ding per VBA so aufdröseln, dass dabei auch noch was G'scheites rauskommt.
Ich könnte mir das mit einer Textsuche pro Zeile vorstellen aber dieses Prozedere ...

An der großen Anzahl von Reaktionen auf deine Anfrage kannst du ungefähr auf den Kosten/Nutzen - Faktor schließen. :-\

Grüße
Peter

DF6GL

Hallo,

habe gerade nichts anderes zu tun....  ;D

Folgende Prozedur  in ein Standardmodul kopieren:

Public Function fktChaosEntflechtung(strFilename As String)
Dim i As Long, a, b, db As Database, lu As Long, rs As DAO.Recordset, strLine
On Error Goto MyErr
lu = FreeFile
Set db = CurrentDb
Set rs = db.OpenRecordset("tbl_Chaosbegrenzung", dbOpenDynaset)

Open strFilename For Input As #lu

Do Until EOF(lu)
Line Input #lu, strLine
a = Split(strLine, "#")

rs.AddNew

For i = 1 To UBound(a)
b = Split(a(i), ":")
rs(Replace(b(0), "Name", "Kennung")) = b(1)
Next

rs.Update
Loop

Close #lu
rs.Close
Set rs = Nothing

Exit_Function:
Exit Function

MyErr:
Msgbox "Fehler: " &  Err.Number & "- " & Err.Description
Resume Exit_Function

End Function



und in einem Formular mittels einem Button aufrufen:

Private Sub Chaosuebernahme_Click()
fktChaosEntflechtung "c:\chaos.csv"      'richtigen Dateinamen angeben...
End Sub



vorher eine Tabelle anlegen mit den Feldern (Datentyp Text):

Kennung   (auf Name "Name" DRINGEND verzichten!)
Strasse
Telefon
Fax
Email


Anke_71