[VB] Textdateien in Access

Krümmelmonster

Grand Admiral Special
Mitglied seit
21.02.2003
Beiträge
3.660
Renomée
2
Standort
schaan
Also bisher lief das so.

Dieser Code (danke Tiku) hat die Textdateien mit ihrem Inhalt eingelesen. (Alle im Verzeichnis)
Sub Einlesen()
Dim db As Database
Dim RS As DAO.Recordset
Dim q As Long
Dim x As String
Dim i As Long
Dim varTDat(1000) As String ' erhöhen wenn >100
Dim txt As String
Dim Text1$, Text2$, Text3$, Text4$, Text5$, Text6$, Text7$, Text8$, Text9$, Text10$, Text11$, Text12$, Text13$, Text14$, Text15$, Text16$, Text17$, Text18$, Text19$, Text20$

' Recordset öffnen
Set db = CurrentDb
Set RS = db.OpenRecordset("tabelle1")

'---Dateinamen feststellen und im 100-Array speichern
x = Dir("c:\log\log\*.txt")
Do
varTDat(i) = x
i = i + 1
x = Dir
Loop Until x = ""

'--- Dateien einlesen mit jeweils 3 Zeilen

' bei Fehler zu fehler springen
On Error GoTo fehler
For q = 0 To i - 1
' Datei öffnen
Open "c:\log\log\" & varTDat(q) For Input As #1
' tue solange wir nicht am Ende der Datei sind...
Do While Not EOF(1)
' 1 Zeile lesen
Line Input #1, txt
' bei jeder 16. Zeile einen neuen Datensatz einfügen
If q Mod 1 = 0 Then RS.AddNew
' Feld füllen
RS("feld" & CStr((q Mod 1) + 1)) = txt
' vor jeder 16. Zeile den Datensatz updaten
If q Mod 1 = 0 Then RS.Update
' Recordset updaten
Loop
' Datei schließen
Close #1
Next q
' Recordset schließen
RS.Close
' Sub verlassen
Exit Sub

fehler:
' Fehlermeldung anzeigen
MsgBox "Es trat folgender Fehler auf: " & Err.Number & " - " & Err.Description
' Datei schließen
Close #1
' Recordset schließen
RS.Close
End Sub

So danach hatte ich eine Tabelle mit 1ner Spalte und über 600000 (sechshundertausend) Datensätzen.
Die lies ich per Abfrage
Wie "*" & [Formulare]![SmsAuswertung]![Adressen] & "*"
und
Wie "*" & [Formulare]![SmsAuswertung]![Monate] & "*"
durchsuchen
im Formular wurde mir dann alles hübsch angezeigt und ausgerechnet stimmte alles bekamm schlussendlich immer das richtige.

Nur ging natürlich das Durchsuchen von 600000 Datensätzen elenlang
Also muss eine Verkürzung der Geschichte her.

Am logischten scheint es das man von Anfang an nur die Daten in die Tabelle aufnimmt die die gewünschten und gesuchten Monate und Adressen enthalten.
Also müsste man zuerst alle Textdateien durchsuchen lassen,
diejenigen die gewisse Daten enthalten in die Tabelle einfügen
und die anderen einfach sein lassen.
und es soll natürlich alles immer nur 1 mal eingefügt werden.
Also wenn eine Textdatei 2 der gesuchten Adressen enthält. darf sie nicht 2 mal eingefügt werden.

Eine weitere Lösung wäre es für jede Adresse eine eigene Tabelle zu machen. Sind bis jetzt ja nur 3.

Also jetz seit ihr an der Reihe.
Wie kann ich den bestehenden Code am besten umformen damit die Tabelle am Schluss ein bisschen schlanker wird?

Danke im Voraus 8)
 
Ich hab mich jetzt durch den VB Code nicht durchgefriemelt, aber möglicherweise sind das auch einfach die Grenzen von Access.

Meine VB Zeit ist schon recht lange her, kann dir da nur bedingt helfen... vor allem ist der Code gerade ziemlich undurchsichtig.

Ich formatier das mal neu, dann guck ich mal grob drüber.

Code:
Sub Einlesen()
	Dim db As Database
	Dim RS As DAO.Recordset
	Dim q As Long
	Dim x As String
	Dim i As Long
	Dim varTDat(1000) As String '// erhöhen wenn >100
	Dim txt As String
	Dim Text1$, Text2$, Text3$, Text4$, Text5$, Text6$, Text7$, Text8$, Text9$, Text10$, Text11$, Text12$, Text13$, Text14$, Text15$, Text16$, Text17$, Text18$, Text19$, Text20$

	'// Recordset öffnen
	Set db = CurrentDb
	Set RS = db.OpenRecordset("tabelle1")

	'//---Dateinamen feststellen und im 100-Array speichern
	x = Dir("c:\log\log\*.txt")
	Do
		varTDat(i) = x
		i = i + 1
		x = Dir
	Loop Until x = ""

	'//--- Dateien einlesen mit jeweils 3 Zeilen
	'// bei Fehler zu fehler springen
	On Error GoTo fehler

	For q = 0 To i - 1
		'// Datei öffnen
		Open "c:\log\log\" & varTDat(q) For Input As #1
		'// tue solange wir nicht am Ende der Datei sind...
		Do While Not EOF(1)
			'// 1 Zeile lesen
			Line Input #1, txt
			'// bei jeder 16. Zeile einen neuen Datensatz einfügen
			If q Mod 1 = 0 Then RS.AddNew
			'// Feld füllen
			RS("feld" & CStr((q Mod 1) + 1)) = txt
			'// vor jeder 16. Zeile den Datensatz updaten
			If q Mod 1 = 0 Then RS.Update
		'// Recordset updaten
		Loop
		
		'// Datei schließen
		Close #1
		
	Next q
	
	'// Recordset schließen
	RS.Close
'// Sub verlassen
Exit Sub

fehler:
	'// Fehlermeldung anzeigen
	MsgBox "Es trat folgender Fehler auf: " & Err.Number & " - " & Err.Description
	'// Datei schließen
	Close #1
	'// Recordset schließen
	RS.Close
End Sub
 
Zurück
Oben Unten