Textdateien in Tabelle

Krümmelmonster

Grand Admiral Special
Mitglied seit
21.02.2003
Beiträge
3.660
Renomée
2
Standort
schaan
Habe einen Ordner mit ca 2000 Textdateien alle tragen 2 buchstaben und das datum als namen.
Von diesen Text dateien brauch ich alle die eine gewisse zeichenfolge enthalten.
Alle Textdateien die diese Zeichenfolgen enthalten sollen in einer Tabelle zusammengefasst werden.
Wie zum Teufel mach ich das?

Habe mich kurz mit Access und VBS beschäftigt..
das sah dann so aus.

Function Einlesen()

Dim db As Database, rs As Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("tabelle")
Dim q%, x$, i%
Dim varTDat(5000) ' erhöhen wenn >100
Dim Text1$, Text2$, Text3$, Text4$, Text5$, Text6$, Text7$, Text8$, Text9$
For i = 0 To 99
varTDat(i) = ""
Next
i = 0
x = Dir("c:\log\log\*.txt")
varTDat(0) = x
Do While x <> ""
i = i + 1
x = Dir
varTDat(i) = x
Loop
For q = 0 To i - 1
On Error GoTo bye
Open "c:\" & varTDat(q) For Input As #1
Do While Not EOF(1)
Input #1, Text1, Text2, Text3, Text4, Text5, Text6, Text7, Text8, Text9
rs.AddNew
rs("feld1") = Text1
rs("feld2") = Text2
rs("feld3") = Text3
rs("feld3") = Text4
rs("feld3") = Text5
rs("feld3") = Text6
rs("feld3") = Text7
rs("feld3") = Text8
rs("feld3") = Text9
rs.Update
Loop
Close #1
Next q
bye:
rs.Close

End Function


das funktioniert natürlich total nicht weil ich auch keine ahnung von vbs habe und sonstigen sprachen ausser batch..

aber jemand ne idee??? muss nicht access und vbs sein kann auch mysql oder sowas sein..
 
Code:
Function Einlesen()
  Dim bHasString As Boolean
  Dim db As Database
  Dim rs As Recordset
  Dim i As Integer
  Dim q As Integer
  Dim x As String
  Dim varTDat(5000) As String ' erhöhen wenn >100
  Dim Text1 As String
  Dim Text2 As String
  Dim Text3 As String
  Dim Text4 As String
  Dim Text5 As String
  Dim Text6 As String
  Dim Text7 As String
  Dim Text8 As String
  Dim Text9 As String

  Set db = CurrentDb
  Set rs = db.OpenRecordset("tabelle")

  x = Dir("c:\log\log\*.txt")
  While x <> ""
    If x <> "." And x <> ".." Then
      varTDat(i) = x
      i = i + 1
    End If
    x = Dir
  WEnd
  On Error GoTo bye
  For q = 0 To i - 1
    Open "c:\" & varTDat(q) For Input As #1
      While Not EOF(1)
        Input #1, Text1, Text2, Text3, Text4, Text5, Text6, Text7, Text8, Text9
        ' Text1 bis Text9 enthält jetzt jeweils 1 Zeile!
        bHasString = (Text1 Like "xyz")
        bHasString = bHasString Or (Text2 Like "xyz")
        bHasString = bHasString Or (Text3 Like "xyz")
        bHasString = bHasString Or (Text4 Like "xyz")
        bHasString = bHasString Or (Text5 Like "xyz")
        bHasString = bHasString Or (Text6 Like "xyz")
        bHasString = bHasString Or (Text7 Like "xyz")
        bHasString = bHasString Or (Text8 Like "xyz")
        bHasString = bHasString Or (Text9 Like "xyz")
        ' wenn eine Zeile die Zeichenfolge xyz enthält, ist bHasString jetzt True
        ' man kann auch Platzhalter verwenden: "abcyz" Like "*yz" gibt True zurück

        rs.AddNew
        rs("feld1") = Text1
        rs("feld2") = Text2
        rs("feld3") = Text3
        rs("feld3") = Text4
        rs("feld3") = Text5
        rs("feld3") = Text6
        rs("feld3") = Text7
        rs("feld3") = Text8
        rs("feld3") = Text9
        rs.Update
      WEnd
    Close #1
  Next q

bye:
  rs.Close
End Function
Ob der Datenbank-Code stimmt, weiß ich jetzt nicht, schau da notfalls mal hier vorbei. Der Rest müsste eigentlich klappen (kanns grad nicht testen).
 
Zuletzt bearbeitet:
Hatte noch einen kleinen Fehler drin. Übrigens ist das VBA und kein VBS.

Original geschrieben von Friday69
verdammt ich weiss nicht mal wie man das gescheit einbindent..
Hmmm, gute Frage. Das letzte Mal, dass ich mit Access und VBA hantiert habe war vor ziemlich genau 3 Jahren beim Bund. Seitdem nutze ich auch kein Access mehr.

Original geschrieben von Friday69
wieso geht das copy & paste ned?
Was genau geht denn nicht?
 
Access bietet doch aber auch so eine Importfunktion. Habe auf Arbeit so selber schon große Textdateien importiert. *noahnung*
 
Original geschrieben von Campari
Access bietet doch aber auch so eine Importfunktion. Habe auf Arbeit so selber schon große Textdateien importiert. *noahnung*

ja aber das sind mehr als 2000 textdateien :P

und da hab ich ja also diesen schönen code.. also geh ich auf access.erstelle ein neues modul und kopier den code da rein oder? ;D
ich seh schon.. beschränktes denken *buck*

habt ihr ne idee.. für was anderes als access bezüglich datenbanken.. den dieses access hängt mir sowas zum hals raus. :-*

zum beispiel my sql oder was auch immer?
 
Zuletzt bearbeitet:
Original geschrieben von Friday69
habt ihr ne idee.. für was anderes als access bezüglich datenbanken.. den dieses access hängt mir sowas zum hals raus. :-*

zum beispiel my sql oder was auch immer?

Du solltest wissen, was du willst und brauchst. Access ist ein DB-frontend, keine Datenbank. Für eine richtige DB kannst du dir mal MySQL oder PostgreSQL ansehen. Vor allem ersteres ist sehr gut dokumentiert, und für kleinere Sachen vollkommen ausreichend. Beide DBMS sind frei verfügbar, mach dich im Netz dazu schlau.
 
Also um das ganz deutlich zu machen..

Es sind 601 Textdateien aber es werden mehr hinzukommen Tag für Tag.
Die Grösse dieser Dateien reich von ein paar Bytes bis zu 300Kbyte.
Die Namensgebung der Dateien ist ähnlich aber nicht gleich.
Gesucht werden alle Textdateien die z.b den Inhalt "Mail@Sms.li" enthalten.
Dieso sollen dann ausgewertet werden d.h die Daten von der Datei in eine Datenbank zu übernehmen.

Ob man jetzt zuerst herausfiltert und dann in die Datenbank integriert oder zuerst alles in eine Datenbank und dann die Sachen herausfiltert ist egal.

Hier mal ein Beispiel einer Datei:

00000 192.********* Wed, 28 Apr 2004 00:01:27 +0200 <-- +OK MERCUR POP3-Server (v4.02.12 *********) for Windows NT ready <*******@mail.sms.li-gate.com>
00456 192.********* Wed, 28 Apr 2004 00:01:28 +0200 --> HELO
00456 192.********* Wed, 28 Apr 2004 00:01:28 +0200 <-- +OK ****.li-gate.com Hello 192.*********
00456 192.********* Wed, 28 Apr 2004 00:01:28 +0200 --> QUIT
00456 192.********* Wed, 28 Apr 2004 00:01:28 +0200 <-- +OK
00000 192.********* Wed, 28 Apr 2004 00:06:28 +0200 *** POP3-User 192.1****
connect

irgendwie so sieht das aus..

Vielleicht merken einige das es sich um Logdateien handelt.
Wie man aus einer Datenbank in Access Abfragen erstellt usw.. weiss ich ja aber wie zum Teufel kann ich über 600 Textdateien durchsuchen und diejenigen die das Resultat enthalten einbinden?

Ich will einfach die einfachst möglichste Lösung.. Ich bin eine Niete was DB anbelangt und von programmieren kann ich nur ein bisschen Batch.
 
Function Einlesen()
Dim db As Database, rs As Recordset
Set db = CurrentDb("currentdb")
Set rs = db.OpenRecordset("tabelle")
Dim q%, x$, i%
Dim varTDat(1000) ' erhöhen wenn >100
Dim Text1$, Text2$, Text3$, Text4$, Text5$, Text6$, Text7$, Text8$, Text9$, Text10$, Text11$, Text12$, Text13$, Text14$, Text15$

'---Dateinamen feststellen und im 100-Array speichern

For i = 0 To 1000
varTDat(i) = ""
Next

i = 0
x = Dir("c:\log\log\*.txt")
varTDat(0) = x
Do While x <> ""
i = i + 1
x = Dir
varTDat(i) = x
Loop

'--- Dateien einlesen mit jeweils 3 Zeilen

For q = 0 To i - 1
On Error GoTo bye
Open "c:\log\log\" & varTDat(q) For Input As #1
Do While Not EOF(1)
Input #1, Text1, Text2, Text3, Text4, Text5, Text6, Text7, Text8, Text9, Text10, Text11, Text12, Text13, Text14, Text15
rs.AddNew
rs("feld1") = Text1
rs("feld2") = Text2
rs("feld3") = Text3
rs("feld4") = Text4
rs("feld5") = Text5
rs("feld6") = Text6
rs("feld7") = Text7
rs("feld8") = Text8
rs("feld9") = Text9
rs("feld10") = Text10
rs("feld11") = Text11
rs("feld12") = Text12
rs("feld13") = Text13
rs("feld14") = Text14
rs("feld15") = Text15
rs.Update
Loop
Close #1
Next q
bye:
rs.Close
End Function


Laufzeitfehler 3734

Die Datenbank wurde vom Benutzer Admin auf Computer SOundSo in einen Status versetzt, in dem sie nicht geöffnet oder gesperrt werden kann.

Wenn ich dann auf Debuggen klicke ist die 3. Zeile " Set db = CurrentDb("currentdb") " Gelb umrandet also anscheinend Fehlerhaft.

Weiss da jemand was?
 
moin moin

Nicht, dass ich was von Access oder deinem Script verstehe, aber im MS SQL Server könnte die Meldung bedeuten, dass du grade über die grafische Oberfläche auf die DB zugreifst (Tabellenansicht) und sie (die Tabelle...) deshalb gesperrt ist.

Nur mein erster Gedanke...
 
Ne der Fehler war das ich anscheinen gleichzeitig DAO wie ADO versucht habe zu verwenden.

Jetzt lautet der Code so:
Funktioniert zwar immer noch nicht, aber das erste mal das ich keine Fehlermeldung bekomme.
Function Einlesen()
Dim db As Database, RS As DAO.Recordset
Set db = CurrentDb
Set RS = db.OpenRecordset("tabelle")
Dim q%, x$, i%
Dim varTDat(1000) ' erhöhen wenn >100
Dim Text1$, Text2$, Text3$, Text4$, Text5$, Text6$, Text7$, Text8$, Text9$, Text10$, Text11$, Text12$, Text13$, Text14$, Text15$

'---Dateinamen feststellen und im 100-Array speichern

For i = 0 To 1000
varTDat(i) = ""
Next

i = 0
x = Dir("c:\log\log\*.txt")
varTDat(0) = x
Do While x <> ""
i = i + 1
x = Dir
varTDat(i) = x
Loop

'--- Dateien einlesen mit jeweils 3 Zeilen

For q = 0 To i - 1
On Error GoTo bye
Open "c:\log\log\" & varTDat(q) For Input As #1
Do While Not EOF(1)
Input #1, Text1, Text2, Text3, Text4, Text5, Text6, Text7, Text8, Text9, Text10, Text11, Text12, Text13, Text14, Text15
RS.AddNew
RS("feld1") = Text1
RS("feld2") = Text2
RS("feld3") = Text3
RS("feld4") = Text4
RS("feld5") = Text5
RS("feld6") = Text6
RS("feld7") = Text7
RS("feld8") = Text8
RS("feld9") = Text9
RS("feld10") = Text10
RS("feld11") = Text11
RS("feld12") = Text12
RS("feld13") = Text13
RS("feld14") = Text14
RS("feld15") = Text15
RS.Update
Loop
Close #1
Next q
bye:
RS.Close
End Function
 
und schon hab ich das nächste Problem

Open "c:\log\log\" & varTDat(q) For Input As #1

nach dieser Linie springt das Programm automatisch auf

RS.Close
End Function


ab und zu gehts auch weiter bis
RS("feld2") = Text2

und springt erst dann runter

in der überwachung steht sogar das dann Feld 1 einen wert hat.. aber das wars dann auch :-/ reingeschrieben wird nix
 
Original geschrieben von Friday69
und schon hab ich das nächste Problem

Open "c:\log\log\" & varTDat(q) For Input As #1

nach dieser Linie springt das Programm automatisch auf

RS.Close
End Function
Füge mal nach bye: folgende Zeile ein:
Code:
MsgBox "Es trat folgender Fehler auf: " & Err.Number & " - " & Err.Description
Original geschrieben von Friday69
in der überwachung steht sogar das dann Feld 1 einen wert hat.. aber das wars dann auch :-/ reingeschrieben wird nix
Weil das RS.Update nicht aufgerufen wird.
 
JA die Message Boc kommt jetz mit : 0 -
aber was heisst das nun?

und wie rufe ich das rs update auf..

sorry aber ich hab eben wie gesagt keine ahnung von vba ich hab mir diesen code nur in stundenlanger arbeit zusammengeschuster und zusammengeklaut. :-[
 
Original geschrieben von Friday69
JA die Message Boc kommt jetz mit : 0 -
aber was heisst das nun?
Dass kein Fehler aufgetreten ist.

Damit das nochmal was wird, solltest Du Dich dringend in VBA einarbeiten und versuchen, den Code zu verstehen. Als erstes solltest Du die Variablen richtig deklarieren. varTDat ist bei Dir bspw. ein Variant, obwohl String besser wäre. Dann könntest Du auch die allererste For-Schleife weglassen. Statt mit den Kürzeln $, & und % solltest Du As String, As Long und As Integer schreiben, da das schonmal die Lesbarkeit erhöht. Desweiteren solltest Du mal nach der Zeile mit dem Input #1 jeden der gelesenen Werte mit MsgBox "Text1=" & Text1 usw. ausgeben, damit Du siehst was überhaupt gelesen wurde. Vermutlich gibt's da schon Probleme.
Sind die Felder in der Tabelle alle vom Datentyp String? Ansonsten könnte es AFAIK bei RS("bla") = ... Probleme geben, da Textx ein String ist.
 
Access hat meines Wissens auch eine recht gute Hilfe zu VBA.
 
Ok jetzt sieht er so aus

Function Einlesen()
Dim db As Database, RS As DAO.Recordset
Set db = CurrentDb
Set RS = db.OpenRecordset("tabelle1")
Dim q As Long
Dim x As String
Dim i As Integer
Dim varTDat(1000) ' erhöhen wenn >100
Dim Text1$, Text2$, Text3$, Text4$, Text5$, Text6$, Text7$, Text8$, Text9$, Text10$, Text11$, Text12$, Text13$, Text14$, Text15$

'---Dateinamen feststellen und im 100-Array speichern

For i = 0 To 1000
varTDat(i) = ""
Next

i = 0
x = Dir("c:\log\log\*.txt")
varTDat(0) = x
Do While x <> ""
i = i + 1
x = Dir
varTDat(i) = x
Loop

'--- Dateien einlesen mit jeweils 3 Zeilen

For q = 0 To i - 1
On Error GoTo bye
MsgBox "Es trat folgender Fehler auf: " & Err.Number & " - " & Err.Description
Open "c:\log\log\" & varTDat(q) For Input As #1
Do While Not EOF(1)
Input #1, Text1, Text2, Text3, Text4, Text5, Text6, Text7, Text8, Text9, Text10, Text11, Text12, Text13, Text14, Text15
RS.AddNew
RS("feld1") = Text1
MsgBox "Text1=" & Text1
RS("feld2") = Text2
MsgBox "Text2=" & Text2
RS("feld3") = Text3
MsgBox "Text3=" & Text3
RS("feld4") = Text4
MsgBox "Text4=" & Text4
RS("feld5") = Text5
RS("feld6") = Text6
RS("feld7") = Text7
RS("feld8") = Text8
RS("feld9") = Text9
RS("feld10") = Text10
RS("feld11") = Text11
RS("feld12") = Text12
RS("feld13") = Text13
RS("feld14") = Text14
RS("feld15") = Text15
RS.Update
Loop
Close #1
Next q
bye:
RS.Close
End Function

also entweder sprint er von dieser zeile
Open "c:\log\log\" & varTDat(q) For Input As #1

direkt zum ende

oder er
er gibt bei MsgBox "Text1=" & Text1 diesen inhalt aus
und springt dann bei
RS("feld2") = Text2
ans ende.

aber hey schon wieder ein schritt weiter.. kann ich morgen wieder dransitzen :]
 
Argh! Nimm mal folgendes als Grundlage für weitere Versuche:
Code:
Sub Einlesen()
  Dim db As Database
  Dim RS As DAO.Recordset
  Dim q As Long
  Dim x As String
  Dim i As Integer
  Dim varTDat(1000) As String ' erhöhen wenn >100
  Dim Text1$, Text2$, Text3$, Text4$, Text5$, Text6$, Text7$, Text8$, Text9$, Text10$, Text11$, Text12$, Text13$, Text14$, Text15$

  ' 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)
        Input #1, Text1, Text2, Text3, Text4, Text5, Text6, Text7, Text8, Text9, Text10, Text11, Text12, Text13, Text14, Text15
        RS.AddNew
        MsgBox "Text1=" & Text1
        RS("feld1") = Text1
        MsgBox "Text2=" & Text2
        RS("feld2") = Text2
        MsgBox "Text3=" & Text3
        RS("feld3") = Text3
        MsgBox "Text4=" & Text4
        RS("feld4") = Text4
        MsgBox "Text5=" & Text5
        RS("feld5") = Text4
        MsgBox "Text6=" & Text6
        RS("feld6") = Text6
        MsgBox "Text7=" & Text7
        RS("feld7") = Text7
        MsgBox "Text8=" & Text8
        RS("feld8") = Text8
        MsgBox "Text9=" & Text9
        RS("feld9") = Text9
        MsgBox "Text10=" & Text10
        RS("feld10") = Text10
        MsgBox "Text11=" & Text11
        RS("feld11") = Text11
        MsgBox "Text12=" & Text12
        RS("feld12") = Text12
        MsgBox "Text13=" & Text13
        RS("feld13") = Text13
        MsgBox "Text14=" & Text14
        RS("feld14") = Text14
        MsgBox "Text15=" & Text15
        RS("feld15") = Text15
        ' Recordset updaten
        RS.Update
      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
 
na danke geht doch dachte schon ich muss mich noch dümmer anstellen :P


wie schon erwähnt du kannst einem kindergärtner.. auch nicht einfachso erhöhte algebra beibringen *buck*
 
Naja, wenn er bei dem Input plötzlich über das Dateiende kommt, gibt's natürlich Probleme. Also am besten immer nur 1 Zeile am Stück einlesen:
Code:
Sub Einlesen()
  Dim db As Database
  Dim RS As DAO.Recordset
  Dim q As Long
  Dim x As String
  Dim i As Integer
  Dim varTDat(1000) As String ' erhöhen wenn >100
  Dim txt As String

  ' 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 16 = 0 Then RS.AddNew
        ' Feld füllen
        MsgBox CStr((q Mod 16) + 1) & "=" & txt
        RS(CStr((q Mod 16) + 1)) = txt
        ' vor jeder 16. Zeile den Datensatz updaten
        If q Mod 16 = 15 Then RS.Update
      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
Wenn er beim letzten Datensatz vor Feld 15 auf das Dateiende trifft, müsste dieser Datensatz automatisch verworfen werden, da dann das RS.Update nicht aufgerufen wird.

(Alle Angaben ohne Gewähr - ich hab's nicht getestet)
 
MsgBox CStr((q Mod 16) + 1) & "=" & txt
RS(CStr((q Mod 16) + 1)) = txt

hier muss noch ein fehler drinliegen..
es gibt die fehlermeldung
3265 Element in dieser Auflistung nicht gefunden.
anscheinend wird der wert nicht richtig eingetragen,
cih weiss zwar ned was das ist aber.. naja googlen ;D
 
'Mod' bedeutet Modulo. Es gibt Dir den Rest der Division zurück:
0 Mod 16 = 0
1 Mod 16 = 1
...
15 Mod 16 = 15
16 Mod 16 = 0
17 Mod 16 = 1
usw.
'CStr' wandelt etwas in einen String um.
Der Fehler ist, dass ich etwas vergessen habe. Es muss heißen:
Code:
MsgBox CStr((q Mod 16) + 1) & "=" & txt
RS("feld" & CStr((q Mod 16) + 1)) = txt
 
Zurück
Oben Unten