11. januar 2008 - 19:43Der 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
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
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:
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.
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 ?
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
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
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.