Avatar billede coolkey Nybegynder
11. januar 2008 - 19:43 Der er 11 kommentarer og
1 løsning

Import og konvertering

Hej alle.

Jeg skal importere en *.txt fil, fra et fast bibliotek (ex. c:\Import\) til en tabel i Access. I filen er der 5 kolonner og fra 2-50 linier. Den første linie indeholder kolonnenavn.

Access tabellen ser sådan her ud:

Dato  Date
Segment Text(50)
Account Text(50)
Tid Integer

Filen kan se sådan her ud:

Date;Login;Logout;Segment;Account
26DEC2007:15:22:36;06:59:45;14:29:11;1000;Visitor21
30DEC2007:17:01:43;08:32:22;13:17:01;1310;BFR

Når filen importeres, skal DATE kolonnen konverteres til en "alm." dato som denne 26.12.2007 og tiden glemmes.

LOGIN og LOGOUT kolonnerne skal trækkes fra hinanden og laves om til minutter og oprundes til hele minutter (ex. 420 minutter).

Og resten af felterne skal "bare" importeres.

Håber at det er nogen der kan hjælpe.

På forhånd tak

Coolkey
Avatar billede tjacob Juniormester
14. januar 2008 - 17:02 #1
Her er et bud på hvordan du indlæser og formatterer data. Du skal selv lave indlæsningen til tabellen:

Dim i As Integer, j As Integer
    Dim sText() As String
    'Indlæs filen til array sText:
    i = FreeFile
    Open "C:\Documents and Settings\tjacob\Skrivebord\eksp09\Test.txt" For Input As #i
        Do Until EOF(i)
            ReDim Preserve sText(j)
            Line Input #i, sText(j)
            j = j + 1
        Loop
    Close #i
   
    Dim sLine() As String
    Dim sTmp As String
    Dim TabelDato As Date
    Dim TabelTid As Date
    Dim TabelSegment As String
    Dim TabelAccount As String
    'for hver linie fra filen læses de 5(4) datatyper ind.
    'I stedet for at skrive til "Tabel-"-variablerne skal du skrive direkte til tabellen:
    For i = 1 To UBound(sText)
        'del linien op i de 5 datatyper:
        sLine = Split(sText(i), ";", , vbTextCompare)
        'jeg går her ud fra at dato altid er 9 karakterer:
        sTmp = Left(sLine(0), 9)
        'for at kunne konvertere datoen er vi nødt til at indsætte separatorer:
        sTmp = Left(sTmp, 2) & "/" & Mid(sTmp, 3, 3) & "/" & Right(sTmp, 4)
        TabelDato = CDate(sTmp)
        TabelTid = CDate(sLine(2)) - CDate(sLine(1))
        TabelSegment = sLine(3)
        TabelAccount = sLine(4)
    Next i
Avatar billede tjacob Juniormester
14. januar 2008 - 17:03 #2
-Du skal naturligvis indsætte en anden sti til filen ;)
Avatar billede tjacob Juniormester
14. januar 2008 - 17:18 #3
Jeg glemte at omregne tiden til minutter:

Indsæt: Dim StrTid As String og Dim TabelMinutter As Integer
linien: TabelTid = CDate(sLine(2)) - CDate(sLine(1)) erstattes af:

TabelTid = CDate(sLine(2)) - CDate(sLine(1))
StrTid = CStr(TabelTid)
TabelMinutter = CInt(Left(StrTid, 2)) * 60
TabelMinutter = TabelMinutter + CInt(Mid(StrTid, 4, 2))
If Not Right(StrTid, 2) = "00" Then TabelMinutter = TabelMinutter + 1
Avatar billede klk Nybegynder
15. januar 2008 - 10:52 #4
End If

Jeg sidder med et tilsvarende problem, og er hoppet på her, som spørger.

Det er dygtigt gjort tjacob. Der er godt nok brugt nogen funktioener:
Ubound
Split
Left
Mid
Right
CDate
CInt
Jeg har fået en del ud af det som lærerigt eksempel - tak for det.

Jeg har prøvet forslaget af og det virker fint, men nu kan jeg ikke få det ind i min tabel. Jeg har tilføjet følgende kode:

  MsgBox TabelDato
  MsgBox TabelTid
  MsgBox TabelMinutter
  MsgBox TabelSegment
  MsgBox TabelAccount
 
  Dim strSQL As String
  strSQL = "Insert Into [Tbl_Imported] (Dato, Tid, Minutter, Segment, Account)" & TabelDato + "," & TabelTid + "," & TabelMinutter + "," & TabelSegment + "," & TabelAccount
 
  DoCmd.RunSQL strSQL

Det giver en runtime error '13'. Jeg har prøvet at sætte både Dato og tid til tekst og "Dato klokkeslet", men lige meget hjælper det.

Hvad er der galt med min syntax
Avatar billede klk Nybegynder
15. januar 2008 - 10:53 #5
Hvis det lykkes, hvordan får jeg så den næste linie læst og proppet ind i tabellen?
Avatar billede tjacob Juniormester
15. januar 2008 - 12:34 #6
>>klk

Det var med vilje at jeg ikke gik ind i database-delen, da jeg ikke er så 'stiv' i den slags.

Men umiddelbart vil jeg mene at opbygningen med loopet der finder de 4 felter til tabellen for hver linie i filen, mere indbyder til at arbejde med RecordSets i f.eks. ADO, end SQL-kommandoer.

Men, hvis du får din SQL til at virke:
Den skal opdateres for hver linie i filen, så SQL-delen skal lægges ind nederst i loopet, således at du fyrer 'DoCmd.RunSQL strSQL' af hver gang en linie er indlæst.
Avatar billede coolkey Nybegynder
15. januar 2008 - 15:18 #7
Hej tjacob.

Det virker bare helt efter hensigten. Smid et svar, så får du point.

Lige et tillægsspørgsmål: Hvis jeg vil kunne vælge en *.txt fil, hvordan gørs dette så ? Lad os sige, der er 3-5 forskellige filer jeg vil kunne importere ?

Coolkey
Avatar billede coolkey Nybegynder
15. januar 2008 - 15:47 #8
>klk

Jeg har gjort det på denne måde:

Sub IndlaesFil()

    Dim dbDatabase As Database
    Dim rsTest As Recordset
   
    Set dbDatabase = DBEngine.Workspaces(0).Databases(0)
    Set rsTest = dbDatabase.OpenRecordset("tblTest", DB_OPEN_DYNASET)

    Dim i As Integer, j As Integer
    Dim sText() As String
    'Indlæs filen til array sText:
    i = FreeFile
    Open "C:\test\Test.txt" For Input As #i
        Do Until EOF(i)
            ReDim Preserve sText(j)
            Line Input #i, sText(j)
            j = j + 1
        Loop
    Close #i
   
    Dim sLine() As String
    Dim sTmp As String
    Dim TabelTid As Date
    Dim StrTid As String
    Dim TabelMinutter As Integer
   
    'for hver linie fra filen læses de 5(4) datatyper ind.
    'I stedet for at skrive til "Tabel-"-variablerne skal du skrive direkte til tabellen:
    For i = 1 To UBound(sText)
        'del linien op i de 5 datatyper:
        sLine = Split(sText(i), ";", , vbTextCompare)
        'jeg går her ud fra at dato altid er 9 karakterer:
        sTmp = Left(sLine(0), 9)
        'for at kunne konvertere datoen er vi nødt til at indsætte separatorer:
        sTmp = Left(sTmp, 2) & "/" & Mid(sTmp, 3, 3) & "/" & Right(sTmp, 4)
        TabelTid = CDate(sLine(2)) - CDate(sLine(1))
        StrTid = CStr(TabelTid)
        TabelMinutter = CInt(Left(StrTid, 2)) * 60
        TabelMinutter = TabelMinutter + CInt(Mid(StrTid, 4, 2))
        If Not Right(StrTid, 2) = "00" Then TabelMinutter = TabelMinutter + 1
     
        rsTest.AddNew
        rsTest.Fields!Dato = CDate(sTmp)
        rsTest.Fields!Tid = TabelMinutter
        rsTest.Fields!Segment = sLine(3)
        rsTest.Fields!Account = sLine(4)
        rsTest.Update

    Next i
End Sub
Avatar billede tjacob Juniormester
15. januar 2008 - 16:13 #9
Mht at vælge filer:

Det der giver størst frihed er at lade bruger vælge filen:

Tilføj komponenten "Microsoft Common Dialog Control 6.0" til dit projekt, og læg en kontrol i formen:

I toppen af din Sub IndlaesFil tilføjer du flg. kode:

    Dim sPath as string
    Me.CommonDialog1.Filter = "Text (*.txt)|*.txt"    'så vises kun .txt filer
    Me.CommonDialog1.CancelError = False
    Me.CommonDialog1.ShowOpen
    'Her kan du evt sætte InitDir -den mappe dialogboxen åbner i
    sPath = Me.CommonDialog1.FileName
    If sPath = "" Then Exit Sub    'hvis bruger annullerer

Linen: Open "C:\test\Test.txt" For Input As #i          Erstattes af: Open sPath For Input As #i
Avatar billede tjacob Juniormester
15. januar 2008 - 16:15 #10
En lille fejl: Hvis du vil indsætte InitDir skal det gøres FØR ShowOpen
Avatar billede coolkey Nybegynder
15. januar 2008 - 17:26 #11
>tjacob

Endnu engang tak
Avatar billede tjacob Juniormester
15. januar 2008 - 17:36 #12
Selv tak, -og for points.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester