Bestanden uit een map importeren

Status
Niet open voor verdere reacties.

Semafoor

Gebruiker
Lid geworden
29 aug 2007
Berichten
129
Hallo iedereen,

Ik moet in excel of access een soorte met van database maken van verschillende .log files (de inhoud daar van) Alleen zit ik nu met een probleem, Na een tijdje zoeken heb ik verschillende VBA scripts gevonden.Nu weet ik niet of ik deze gewoon kan combineren met elkaar. Ook brengen de .log files me in de problemen. Het nummer is namelijk variabel. Nu komt er wel elke dag een bestand bij!! Ik heb op dit moment het programma al zo ver dat ik een bestand uit een map kan halen en deze in een excel bestand te plaatsen. Nu moet alleen dit "kopieren" met alle bestanden herhalen in de map zonder overschrijven en automatisch alle bestanden meenemen, zonder dat ik het bestand zelf moet selecteren.
Dit is het code dat ik gevonden heb voor het importeren van een file. Maar wat dus maar half werkt/

Code:
Sub ImportRange(A1)
    Dim ImpRng As Range
    Dim FileName As String
    Dim r As Long
    Dim c As Integer
    Dim txt As String
    Dim Char As String * 1
    Dim Data
    Dim i As Integer

    Set ImpRng = ActiveCell
    On Error Resume Next
    FileName = "\\SERVER02\logfiles\confile08282007.log"
    Open FileName For Input As #1
    If Err <> 0 Then
        MsgBox "Not Found: " & FileName, vbCritical, "ERROR"
        Exit Sub
    End If
    r = 0
    c = 0
    txt = " "
    Do Until EOF(1)
        Line Input #1, Data
    For i = 1 To Len(Data)
        Char = Mid(Data, i, 1)
        If Char = "," Then
            ActiveCell.Offset(r, c) = txt
            c = c + 1
            txt = " "
        ElseIf i = Len(Data) Then
            If Char <> Chr(34) Then txt = txt & Char
            ActiveCell.Offset(r, c) = txt
            txt = " "
        ElseIf Char <> Chr(34) Then
            txt = txt & Char
        End If
    Next i
    c = 0
    r = r + 1
Loop
Close #1
End Sub
Mij lijkt het me verstandig om dit in Access te doen aangezien het gigantisch veel bestanden zijn.
Kan je VBA scripts die in excel werken ook in Accesss gebruiken?

Ik hoop dat het duidelijk is.. Ik kan soms nogal kort door de bocht zijn...

Al bedankt,

Stefan
Leek in VBA
 
Laatst bewerkt:
Hallo Stefan !

Lijkt mij een interessante opgave.

Ik vermoed dat je een aantal textfiles hebt (iedere dag één meer) met daarin een aantal lijnen met waarden tussen aanhalingstekens en gescheiden door een komma. Iedere lijn van iedere textfile moet dus een record in een datatable worden.

In de bijlage vind je een Excel-macro (Sub ImportMoreFiles), gebaseerd op je eigen code (Sub ImportRange) die we loslaten op iedere logfile die we ontmoeten via een FileSystemObject.

Om te bekomen dat we iedere logfile slechts één keer importeren (tijdswinst) gebruiken we de functie IsAlreadyImported() en om de gegevens van iedere logfile te "appenden" is de ActiveCell in jou code vervangen door de eerste vrije cell.

De macro is in de rapte geschreven en kan waarschijnlijk wel hier en daar eleganter, maar hij kan volgens mij wel dienen om op verder te borduren.

Succes & groeten,
MDN111.
 

Bijlagen

Heel erg bedankt

hallo,

Ik wil je echt heel erg bedanken. :thumb: Ik had eigenlijk niet echt meer verwacht dat er iemand met een oplossing kon komen. Ik zal het gaan uitproberen.

Nogmaals dank.

Stefan
 
Hij doet het niet.

Hallo,

Ik wil je nogmaals bedanken voor het maken van dit bestand. :thumb:
Hij doet het alleen niet, wanneer ik het Path heb aan gepast geeft excel een melding bij het uitvoeren van de macro. :confused:
Notfound: confile08262007
Notfound: confile08292007
ect.. ect..

Heeft iemand enig idee hoe dat komt?

Ik heb dan nog een vraag?? Kan je deze macro ook in access gebruiken?

Stefan
 
Hallo Stefan !

Ik zie dat de bestandsnamen die je opgeeft als niet gevonden, geen extensie hebben.
Is dat zo ?

Als dat echt zo is dan moet je een ander criterium in de macro zetten zodat alleen de bestanden genomen worden die voldaan aan de bestandsnamen die je gegevens bevatten.

In het geval van de bestanden die je vermeldde:

For Each f1 In fc
If UCase(Left(f1.Name, 7)) = "CONFILE" Then
If Not IsAlreadyImported(f1.Name) Then
Call ImportRange(f1.Name)
End If
End If
Next

Van Access heb ik niet veel kennis, maar ik vermoed dat je deze macro ook in Acces kan gebruiken als je de specifieke Excell-bewerkingen vervangt door Access-bewerkingen.

Succes & groeten,
MDN111.
 
SorryHij ge

hij geeft wel de extentie aan... Was ik er alleen vergeten bij te tikken..
Dit is de melding die hjij geeft
naamloos.bmp


Ik zal kijken of dat andere misschien wel werkt..

"Edit: Werkt ook niet.. Precies de zelfd meldingen.. kan het liggen aan dat script dat ik zelf het toegevoegd? Zie eerste post.."

Bedankt.

Stefan
 
Laatst bewerkt:
Probeer eens door de instructies:

If Not IsAlreadyImported(f1.Name) Then
Call ImportRange(f1.Name)
End If


te vervangen door:

If Not IsAlreadyImported(f1.Path) Then
Call ImportRange(f1.Path)
End If



Groeten,
MDN111.
 
Laatst bewerkt:
Bedankt

Hallo,

Ik wil je nogmaals een keer bedanken. Het werkt nu.
Heel erg bedankt.:thumb:

Stefan
 
nog een vraag..

Wanneer je de logbestand nu importeert krijg je per regel een cel. :rolleyes:
Ik wil alleen per woord gescheiden door een spatie per cel. Hoe kan ik dat het beste aangeven.?

het zijn allemaal regels van deze soort:
Code:
-- BROERS(192.168.+.+++) Opened at 26-8-2007 15:16:24 for:C:\WINNT\system32\spool\drivers\W32X86\3\NRG631S.DLL(READ  0 locks)


Is dat eigenlijk wel mogelijk?


--> Het is al gelukt!!!

Misschien is dit allemaal wel een beetje te veel gevraagd maar ik ben echt een leek in vba!:o

Groeten van
Stefan
 
Laatst bewerkt:
Filteren

Ik zou nu alleen willen weten of je ook regels met een bepaald woord er in er uit kan filteren?
Ik kom steeds probleempjes tegen wanneer ik weer verder ga..

Of vraag ik nu teveel...

Bij voorbaad dank.

Stefan
 
De code die je in je eerste bericht vermeldde is er op gericht om een log-bestand met de hiernavolgende structuur om te zetten in cellen:

"AAA","BBB","CCC"
"DDD","EEE"
"FFF","GGG","HHH","III"

Dus woorden tussen aanhalingstekens gescheiden door een komma. De code werkt want ik heb dat getest.

Blijkbaar hebben je log-files toch een andere structuur, namelijk regels tekst zonder aanhalingstekens of komma's. Vandaar dat je een cel per regel krijgt.

Als de gegevens niet vertrouwelijk zijn, kan je dan zulk logbestand bijvoegen en aangeven welke lijnen geïmporteerd moeten worden en welke niet en waarop het filtercriteria moet gebaseerd zijn.

Groeten,
MDN111.
 
..

Hallo,

Ik had dat al opgelost.. Dat kon door middel van een , in een Spatie te veranderen.
Nu was mijn vraag of je ook kon aangeven dat je alle regels met een bepaalt woord niet invoegde. Het zijn log files van het programma "System Tray share monitor".
scr11.jpg


Ze zien er ongeveer zo uit..
Code:
-- BROERS(192.168.+.+++) Opened at 26-8-2007 15:16:24 for:C:\WINNT\system32\spool\drivers\W32X86\3\NRG631S.DLL(READ  0 locks)
-- BROERS(192.168.+.+++) Opened at 26-8-2007 15:16:24 for:E:sjablonen\screensaver\img958546.jpg(READ  0 locks)
-- BROERS(192.168.+.+++) Opened at 26-8-2007 15:16:24 for:E:sjablonen\screensaver\img958547.jpg(READ  0 locks)
-- BROERS(192.168.+.+++) Opened at 26-8-2007 15:16:24 for:E:sjablonen\screensaver\img958548.jpg(READ  0 locks)
-- BROERS(192.168.+.+++) Opened at 26-8-2007 15:16:24 for:E:sjablonen\screensaver\img958549.jpg(READ  0 locks)
Het zijn allemaal regels als bovenstaande.. All ++ staan voor ip adressen..


In mijn database is het openen van een nieuwe afbeelding van de screensaver niet belangrijk. deze regels wil ik er dus uitfilteren. Alle regels met screensaver.. En dat zijn er wel wat. Ik heb door middel van alle scripts tot nu toe excel al helemaal vol laten lopen.. Maar van de 65536 regels mochten er 61131 weg vanwege die screensaver..

Bekijk bijlage upload.txt

Hopelijk kan je hier iets mee..

Stefan
 
Laatst bewerkt:
Hoi,

Ziet er duidelijk uit alhoewel ik er nog steeds niet bij kan waarom je absoluut ieder woord van een regel in een aparte cel wil. Dat is niet erg want het lijkt mij geen enkel probleem om daarvoor iets te programmeren. Ik vroeg het mij gewoon af.

Wat wel nuttig is om te weten, is het aantal lijnen (zonder screensaver) dat je per dag wil registreren. Je meldt dat er van de 65000 zo'n 61000 weg mochten. De vraag is of de resterende 4000 lijnen het resultaat zijn van een dag, week, maand....? Ook de bewaringstermijn speelt een rol. Hoe langer de bewaringstermijn die je vooropstelt, hoe meer registraties.

Mocht je de eerste dagen niets horen, niet ongerust worden...:cool:

Groeten,
MDN111.
 
Laatst bewerkt:
In elk log file dat ik importeer staan gegevens van 1 dag. Elke logfile heeft over het algemeen een verschillend aantal regels. Dat ligt aan de dag.. Zo zijn er in de meeste weekenden geen registraties.

De bewarings termijn is op dit moment voor ten minste een jaar.. Als het kan langer... Er moeten namelijk grafieken komen en "top tienen" van de meest gebruikte bestanden van een jaar....
Ik ben alleen bang dat ik na 5 weken importeren al aan een max bereikt is..

In het vorbeeld dat ik gaf over die 65000+ is het zo dat het de gegevens van 2 dagen was. Ik heb even gekeken en ben er achter dat dat nietaltijd is. Na een paar (weet niet hoeveel) logfiles is de fuctie screensaver uitgeschakeld en komt die melding niet meer voor.
 
Hallo !

Zet bijgevoegde vier dummy logbestanden en het Excelbestand in dezelfde directory en test het even. Dat zou het zowat moeten zijn.

Voor het in de echte praktijk brengen, niet vergeten de path in de macro aan te passen.

Groeten & succes, :thumb:
MDN111
 

Bijlagen

Hartelijk dank

Ik zal straks even kijken of het werkt.. Maar dat zal wel natuurlijk!!

Dankje wel!

Groeten
Stefan
 
Om een extra quota toe te voegen mag je dan gewoon dit doe?

Code:
'Alleen de lijnen zonder het woord "screensaver" behandelen we verder.
    If InStr(UCase(cLine), "SCREENSAVER" "SYSTEM32") = 0 Then

Of moet je dan de lijn op nieuw neer zetten?

Code:
'Alleen de lijnen zonder het woord "screensaver" behandelen we verder.
    If InStr(UCase(cLine), "SCREENSAVER") = 0 Then
    
'Alleen de lijnen zonder het woord "system32" behandelen we verder.
    If InStr(UCase(cLine), "SYSTEM32") = 0 Then

--> EDIT: Helaas, ik heb het net uitgeprobeert.. Maar wat ik hier boven probeerde lukt helaas niet.. Wat moet ik doen om "system32" ook te kunnen filteren?
Is dit mogelijk?
 
Laatst bewerkt:
Hallo,

Een mogelijke syntax is:

'Alleen de lijnen zonder de woorden "screensaver" of "System32" behandelen we verder.
If InStr(UCase(cLine), "SCREENSAVER") = 0 And InStr(UCase(cLine), "SYSTEM32") = 0 Then


Groeten,
MDN111.
 

Bijlagen

Laatst bewerkt:
MIJN DANK IS GROOT :thumb:

Bedankt voor het helpen.. Mocht ik nog een probleem tegenkomen dan zal ik het hier wel melden. Voor zover is dit "project" klaar.. Er zullen altijd nog wel wat dingen zijn die ik niet zal kunnen oplossen.

Nogmaals dank,

Stefan
smiley_throwpc.gif
 
Kan je ook op twee tekens nieuwe cellen splitsen?

Code:
'De woorden gescheiden door een spatie en een ....., onderbrengen in array-elementen.
aLine = Split(cLine, delimiter:=" ") or aLine = Split(cLine, delimeter:="/")

Of is dit een hele domme bewerking?

Als dit wel kan begin ik het denk ik een beetje te snappen..

Stefan
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan