Import Textdatei in ACCESS

04/01/2008 - 12:02 von Thomas | Report spam
Hallo,

ich möchte eine Text-Datei in MS ACCESS importieren.
Die Datei ist 500MB. und hat ca. 1.4 Mio Zeilen.
Die ersten 600.000 Sàtze werden in ca. 7 Min importiert, dann scheint
irgendwas voll zu laufen, denn der Import ist erst nach 1:21 Stunden fertig.
Die Sàtze haben alle das selbe Format/Göße.
Die Datei hat keinen richtiges Satzende (x'0d') fehlt, deshalb der Zugriff
s.u.
Hab aber auch schon umgewandelt und anders importiert, ist auch nicht
schneller.


Bin schon Tage im Internet am Suchen, aber hab' noch keine Lösung.


Hier den Code:

Function imp_c3save()

Dim c, sl, x, y, z As Integer
Dim teil, vz As String
Dim teil1, vz1 As String
Dim teil2, vz2 As String

Dim Datum As String
Dim aval As String
Dim wert As String
Dim n As Long
Dim test As Double

'Dateivariablen

Dim f As Long ' Dateizeiger
Dim dateiname As String ' Dateiname

'Datensatz aus Datei

Dim satz As String * 355
sl = 355

'Datenbankvariablen
'Dim ws As DAO.Workspace ' Workspace
Dim db As Database 'datenbank
Dim ds As Recordset 'Datensatz

'alte Tabelle löschen
Tab_Del ("C3_import")

'rel_C3 kopieren auf C3_import
DoCmd.CopyObject , "C3_import", acTable, "rel_C3"

'Workspace un DB zuweisen
Set db = DBEngine.Workspaces(0).Databases(0)

Set ds = db.OpenRecordset("C3_import", DB_OPEN_DYNASET)

f = FreeFile()
dateiname = mod_Global.aktVerz() & "comp3.txt"

'Öffnen der Datei
'Open dateiname For Random As f Len = sl
Open dateiname For Input As #f

n = 0
'-- Eröffnen
Transaktion
'ws.BeginTrans
'-- Schleifenbeginn
Do While Not EOF(f)

'Satz aus Datei lesen

' Get #f, , satz

Line Input #f, satz

'neuen Datensatz einfügen
ds.AddNew

If Not EOF(f) Then
'- WKN
ds.Fields(0).Value = Mid(satz, 1, 6)
' Depotnummer
ds.Fields(1).Value = Mid(satz, 8, 10)
' Nennwert
vz = Mid(satz, 19, 1)
teil = Mid(satz, 20, 19)
ds.Fields(2).Value = CDbl(teil) * IIf(vz = "-", -1, 1)
' Depottext
ds.Fields(3).Value = Val(Mid(satz, 40, 2))
' Beleg-Nr
ds.Fields(4).Value = Mid(satz, 43, 13)
' Order-Nr
ds.Fields(5).Value = Mid(satz, 43, 10)
' Datum Schlusstag
teil = Mid(satz, 57, 8)
ds.Fields(6).Value = CDate(Right(teil, 2) & "." & Mid(teil, 5, 2) &
"." & Left(teil, 4))
' WP_Kurs
ds.Fields(7).Value = CDbl(Mid(satz, 66, 14))
' WP_Dev_Kurs
ds.Fields(8).Value = CDbl(Mid(satz, 81, 14))
' WP_Kurs_WHR
teil = Mid(satz, 96, 3)
If teil <> " " Then
ds.Fields(9).Value = teil
End If
' Boersenplatz
teil = Mid(satz, 100, 3)
If (teil <> " ") Then
ds.Fields(10).Value = teil
Else
ds.Fields(10) = Null
End If
' Provision-DM
vz2 = Mid(satz, 104, 1)
teil2 = Mid(satz, 105, 10)


test = (CDbl(teil2) * IIf(vz2 = "-", -1, 1))
ds.Fields(11).Value = test
'- Herkunft Umsatz
teil = Mid(satz, 116, 1)
If teil <> " " Then
ds.Fields(12).Value = teil
End If
'- Kto-Abrechnung
teil = Mid(satz, 118, 10)
If teil <> "0000000000" Then
ds.Fields(13).Value = teil
End If
'- Ausm Betrag Whr
vz2 = Mid(satz, 129, 1)
teil2 = Mid(satz, 130, 18)

test = (CDbl(teil2) * IIf(vz2 = "-", -1, 1))
ds.Fields(14).Value = test
'- Abrechnungsdatum
teil = Mid(satz, 149, 8)
Datum = CStr(Right(teil, 2) & "." & Mid(teil, 5, 2) & "." &
Left(teil, 4))

If IsDate(Datum) Then
ds.Fields(15).Value = CDate(Datum)
End If
'- Buchungsdatum
teil = Mid(satz, 158, 8)
Datum = CStr(Right(teil, 2) & "." & Mid(teil, 5, 2) & "." &
Left(teil, 4))

If IsDate(Datum) Then
ds.Fields(16).Value = CDate(Datum)
End If
'- Verwahrart
wird nicht mehr geliefert!!
'ds.Fields(17).Value = Mid(satz, 167, 2)
'-ARBEITSGEBIET
teil = Mid(satz, 167, 1)
If teil <> " " Then
ds.Fields(17).Value = teil
End If
'-WKN-BID
teil = Mid(satz, 169, 6)
If teil <> " " Then
ds.Fields(18).Value = teil
End If
'-BID
teil = Mid(satz, 176, 12)
If teil <> " " Then
ds.Fields(19).Value = teil
End If
'-STEUER-JJJJMMTT
teil = Mid(satz, 189, 8)
Datum = CStr(Right(teil, 2) & "." & Mid(teil, 5, 2) & "." &
Left(teil, 4))

If IsDate(Datum) Then
ds.Fields(20).Value = CDate(Datum)
End If
'-STEUER-ART
teil = Mid(satz, 198, 2)
If teil <> " " Then
ds.Fields(21).Value = teil
End If
'-KAP-KURSWERT
vz2 = Mid(satz, 201, 1)
teil2 = Mid(satz, 202, 18)

test = (CDbl(teil2) * IIf(vz2 = "-", -1, 1))
ds.Fields(22).Value = test

'-SDI-VA-DATUM-JJJJMMTT
teil = Mid(satz, 221, 8)
Datum = CStr(Right(teil, 2) & "." & Mid(teil, 5, 2) & "." &
Left(teil, 4))

If IsDate(Datum) Then
ds.Fields(23).Value = CDate(Datum)
End If
'
prüfen, ob die sdk-felder gefüllt sind
aval = Mid(satz, 260, 1)
'Debug.Print aval
'If aval = "A" Then

'-SDK-KURS-M-ANK
'teil = Mid(satz, 230, 14)
'Debug.Print teil

ds.Fields(24).Value = CDbl(Mid(satz, 230, 14))

'-SDK-KURS-O-ANK
ds.Fields(25).Value = CDbl(Mid(satz, 245, 14))

'-SDK-KZ-AVAILABLE
ds.Fields(26).Value = aval

'End If
'--
SDI-VORG-BELEG-NR
teil = Mid(satz, 262, 13)
'Debug.Print teil
If teil <> "0000000000000" Then
ds.Fields(27).Value = CDbl(teil)
End If
'--
SDI-ANLAGE-KURZZEICHEN
ds.Fields(28).Value = Mid(satz, 276, 8)
'-- SDK-MK-M-ANK
ds.Fields(29).Value = CDbl(Mid(satz, 285, 14))
'-- SDK-MK-O-ANK
ds.Fields(30).Value = CDbl(Mid(satz, 300, 14))
'--
SDK-SA-NOMINAL
vz2 = Mid(satz, 315, 1)
teil2 = Mid(satz, 316, 19)

test = (CDbl(teil2) * IIf(vz2 = "-", -1, 1))
ds.Fields(31).Value = test
'-- Identnummer
ds.Fields(32).Value = CDbl(Mid(satz, 336, 18))



'Datensatz in DB übernehmen
ds.Update

If (n Mod mod_Global.anzahl_update) = 0 Then
Forms!Start.txtanzahl3.Value = n
Forms!Start.Repaint
DoEvents
'Zwischenclose TA
'ws.CommitTrans
'ws.BeginTrans
End If

'Zwischenclose TA
'If (n Mod 1000) = 0 Then
'ws.CommitTrans [dbForceOSFlush]
'ws.BeginTrans
'End If

Else
ds.CancelUpdate
End If
n = n + 1
If n = mod_Global.test_anzahl And mod_Global.test = True Then Exit Do

Loop

'Schliessen Transaktion
'ws.CommitTrans

mod_Global.anzahl3 = n

' Schliessen Datei
Close #f

ds.Close

End Function
 

Lesen sie die antworten

#1 Mark Doerbandt
04/01/2008 - 12:07 | Warnen spam
Hallo, Thomas,

Thomas:

ich möchte eine Text-Datei in MS ACCESS importieren.
Die Datei ist 500MB. und hat ca. 1.4 Mio Zeilen.
Die ersten 600.000 Sàtze werden in ca. 7 Min importiert, dann scheint
irgendwas voll zu laufen, denn der Import ist erst nach 1:21 Stunden fertig.



da es Dir so auf das Timing ankommt, scheinst Du das Ganze mehrfach
durchfuehren zu wollen. Dann stellt sich mir die Frage, ob Access da
ob der Datenmengen die richtige Wahl ist. Waere nicht ein SQL Server
besser geeignet?

Gruss - Mark

Informationen fuer Neulinge in den Access-Newsgroups unter
http://www.doerbandt.de/Access/Newbie.htm

Bitte keine eMails auf Newsgroup-Beitràge senden.

Ähnliche fragen