import CSV files dagelijks

Status
Niet open voor verdere reacties.

Peer44

Gebruiker
Lid geworden
25 jan 2008
Berichten
224
Hallo, ik wil een aantal log-files dagelijks door access laten inlezen.
De logfiles worden weggeschreven op C:/Log/

de logfiles zijn CSV bestanden deze worden genoemd: d-m-jjjj_GEEL vervolgens is er op dezelfde manier een export van rood en groen, bijv. 22-10-2015_groen.csv
Iedere dag wordt er om 0:00 logfiles weggeschreven.

Is er een mogelijkheid om access dit te laten inlezen in 3 tabellen (per kleur)?
de bestanden moeten wel in de folder blijven staan, dus access moet op de een of andere manier weten welke al ingelezen is.

Alvast bedankt.
 
Dat kun je vrij goed automatiseren. In beginsel heb je daar een database voor nodig die je automatisch laat starten, bijvoorbeeld met een Scheduled Task. Als je bestanden om 0:00 worden aangemaakt, laat je de db dan om 0:30 opstarten bijvoorbeeld. In die db heb je een functie nodig die de bestanden inleest. Doe dat eerst handmatig, dan kun je een Importspecificatie maken die je dan voor je import gebruikt. De bestandsnamen worden gestandaardiseerd aangeleverd, en die kun je dus prima uitlezen uit de map. Of je aparte tabellen nodig hebt kan ik zo niet zien; ik zou alles in één tabel inlezen met een extra veldje met de kleurcode erbij. Lijkt mij handiger. Maar dat kan ik zo uiteraard niet zien.
Je hebt dus een functie die de bestanden importeert; ik zou ze daarna met een MOVE naar een onderliggende map verplaatsen, zodat je daaraan kunt zien of de import gelopen heeft of niet. Bovendien kun je dan de data niet per ongeluk 2 keer inlezen. Maar dat hoeft uiteraard niet. Die functie moet uiteraard nog gestart worden, en dat doe je met een AutoExec macro; die wordt namelijk altijd uitgevoerd als je de db opent. En dat doet de Scheduled Task al. Uiteraard kun je de db daarna weer met een opdracht in de functie afsluiten.
 
Hoi Octafish,

de import is gelukt blijf echter steken op de Move functie;

Code:
FileCopy GetCurrentFile, destination:="U:\in ontwikkeling\inlezen\verwerkt\"

waarschijnlijk komt dit doordat het bestand wat ik inlees nog geopend is maar hoe kan ik dit afsluiten en juist dit bestand verplaatsen?

Code:
Sub Inlezen_CSV()
'hiermee worden de log files ingelezen.

'tijdelijk uitschakelen VBA warnings
DoCmd.SetWarnings False

Dim FName As String
Dim FNames() As String
Dim FType As String
Dim i As Integer
Dim GetDBPath As String
Dim GetCurrentFile As String

' Declare the dir and file settings we are using
FType = "*Groen.csv"
GetDBPath = "U:\in ontwikkeling\inlezen\"
FType = GetDBPath & FType
FName = Dir(FType)
' Run the loop as long as there are files in the dir
Do Until FName = ""
i = i + 1
ReDim Preserve FNames(1 To i)
' Add the current file to the array
FNames(i) = FName
FName = Dir
Loop
If i <> 0 Then
'Keep getting data from the array as long as there is some
For i = 1 To UBound(FNames)

' Make sure that the path is set from the file
' we are importing
GetCurrentFile = GetDBPath & FNames(i)

' Now we import the current select file
DoCmd.TransferText acImportDelim, "ImportSpec", "TblGroen", GetCurrentFile, False, ""

FileCopy GetCurrentFile, destination:="U:\in ontwikkeling\inlezen\verwerkt\"

' And we move to the next file

Next i
End If



DoCmd.SetWarnings True

' Let user know we are finished
MsgBox "gereed"


End Sub
 
FileCopy doet toch alleen kopieëren?
 
Fijn dat het voor je werkt, maar het is wel zo leuk om de code hier ook te posten, want het is een onderwerp dat best vaak voorbij komt (kijk ook maar eens in het Excel forum). En andere lezers kunnen met jou laatste berichtje natuurlijk niet zo veel (ja, tandenknarsen ;) ).
 
Ja daar heb je een punt, google = your friend dus bij deze:

om de CSV te importeren heb ik een aparte code waarin ik na inlezen de CSV-Move functie aanroep:

CSV importeren:
Code:
Sub Inlezen_CSV()
'hiermee worden de log files ingelezen.

'tijdelijk uitschakelen VBA warnings
DoCmd.SetWarnings False

Dim FName As String
Dim FNames() As String
Dim FType As String
Dim i As Integer
Dim GetDBPath As String
Dim GetCurrentFile As String

' Declare the dir and file settings we are using
FType = "test*.csv"
GetDBPath = "C:\testfiles\In te lezen lijsten\"
FType = GetDBPath & FType
FName = Dir(FType)
' Run the loop as long as there are files in the dir
Do Until FName = ""
i = i + 1
ReDim Preserve FNames(1 To i)
' Add the current file to the array
FNames(i) = FName
FName = Dir
Loop
If i <> 0 Then
'Keep getting data from the array as long as there is some
For i = 1 To UBound(FNames)

' Make sure that the path is set from the file
' we are importing
GetCurrentFile = GetDBPath & FNames(i)

' Now we import the current select file
DoCmd.TransferText acImportDelim, "TestSpec", "groen", GetCurrentFile, False, ""



' And we move to the next file

Next i
End If

Call Move_TestFiles



DoCmd.SetWarnings True

' Let user know we are finished
'MsgBox "gereed"


End Sub

de files verplaatsen:

Code:
Sub Move_CSV()
'This example move all Excel files from FromPath to ToPath.
'Note: It will create the folder ToPath for you with a date-time stamp

'tijdelijk uitschakelen VBA warnings
DoCmd.SetWarnings False

    Dim FSO As Object
    Dim FromPath As String
    Dim ToPath As String
    Dim FileExt As String
    Dim FNames As String

    FromPath = "C:\testfiles\In te lezen lijsten\"  '<< Change
    ToPath = "C:\testfiles\ingelezen\" '<< Change only the destination folder

    FileExt = "*.csv"   '<< Change
    'You can use *.* for all files or *.doc for word files

    If Right(FromPath, 1) <> "\" Then
        FromPath = FromPath & "\"
    End If

    FNames = Dir(FromPath & FileExt)
    If Len(FNames) = 0 Then
        MsgBox "No files in " & FromPath
        Exit Sub
    End If

    Set FSO = CreateObject("scripting.filesystemobject")

    'FSO.CreateFolder (ToPath)


    FSO.MoveFile Source:=FromPath & FileExt, Destination:=ToPath
    'MsgBox "You can find the files from " & FromPath & " in " & ToPath
    

 DoCmd.SetWarnings True

End Sub

Mvg Peer
 
Het zal je deugd doen dat je codes ongeveer de helft korter kunnen :).

Code:
Sub Inlezen_CSV()
Dim FName As String, FType As String
Dim GetDBPath As String, GetCurrentFile As String

    ' Declare the dir and file settings we are using
    GetDBPath = "C:\testfiles\In te lezen lijsten\"
    FType = GetDBPath & "test*.csv"
    FName = Dir(FType)
    ' Run the loop as long as there are files in the dir
    Do Until FName = ""
        GetCurrentFile = GetDBPath & FName
        DoCmd.TransferText acImportDelim, "TestSpec", "groen", GetCurrentFile, False, ""
    Loop
    Call Move_TestFiles

End Sub

En de Move, die overigens een stuk netter is, kan ook wat compacter:

Code:
Sub Move_CSV()
Dim FSO As Object
Dim FromPath As String, ToPath As String, FileExt As String, FNames As String

    FromPath = "C:\testfiles\In te lezen lijsten\"  '<< Change
    ToPath = "C:\testfiles\ingelezen\" '<< Change only the destination folder
    FileExt = "*.csv"   '<< Change

    FNames = Dir(FromPath & FileExt)
    If Len(FNames) = 0 Then
        MsgBox "No files in " & FromPath
        Exit Sub
    End If

    Set FSO = CreateObject("Scripting.Filesystemobject")
    'FSO.CreateFolder (ToPath)
    FSO.MoveFile Source:=FromPath & FileExt, Destination:=ToPath
    'MsgBox "You can find the files from " & FromPath & " in " & ToPath

End Sub
 
Dat doet inderdaad deugd, ziet er een stuk beter uit zo.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan