Avatar billede moso Nybegynder
26. november 2008 - 10:58 Der er 28 kommentarer og
1 løsning

Hvordan importeres flere text-filer i mappe til access?

Jeg har behov for at importere flere .txt-filer til access. Jeg har ingen problemer med at importere dem enkeltvis, men da der er mange filer (+150) leder jeg efter hjælp til hvordan jeg kan autimatisere denne import, gerne vha VBA. Nogen forslag?
De har ikke samme struktur, men er alle tabulator separeret.
Avatar billede Slettet bruger
26. november 2008 - 11:26 #1
Du kan se http://www.eksperten.dk/spm/851907 ang. det at hente forskellige strukturer ind i samme tabel og så må du fordele dem ved at løbe dem igennem i vba (hvis det er muligt for dig at genkende de forskellige strukturer og styre hvor de skal hen!~). Du skal så også have en vba løkke, som gennemløber alle txt filer i f.eks. en bestemt mappe og importerer dem med ovenstående metode. Det at finde alle fil navne i en mappe er der et eksempel på, på thomas jepsens www.makeiteasy.dk

...held og lykke!~)
Avatar billede moso Nybegynder
26. november 2008 - 11:30 #2
Jeg leder mere efter en funktion som automatisk opretter tabellerne på baggrund af indholdet i txt-filerne. Der er afvigelse fra fil til fil og der er for mange til at gøre det manuelt.
Prøver lige at kigge på linket.
Avatar billede moso Nybegynder
26. november 2008 - 11:37 #3
Linket giver mig desværre ikke meget at gå efter. Anyone??
Avatar billede moso Nybegynder
26. november 2008 - 11:39 #4
Kan også bruge en ide til hvordan det importeres i excel hvis der er et bedre bud her...
Avatar billede fdata Forsker
26. november 2008 - 15:16 #5
En metode kunne være lige at sprøjte filerne igennem og konvertere tab'erne til semikoloner (det går pænt hurtigt) og så lade Access klare resten med en standard-import.

Her følger en grovskitse.
Hvis der ikke er feltnavne, skal sidste parameter i DoCmd.TransferText ændres til False.
Du skal selvfølgelig også rette mappenavn, filmasker og tabelnavne til de værdier, du skal bruge.

Koden er:

Sub ImporterFlereFiler()
  Const Mappe = "C:\Temp\"
  Dim InputFile As String
  Dim OutputFile As String
  Dim i As Integer
  Dim s As String
 
  InputFile = Dir(Mappe & "fil*.txt")
  Do Until InputFile = ""
    OutputFile = Replace(InputFile, ".txt", ".csv")
    Open Mappe & InputFile For Input As #1
    Open Mappe & OutputFile For Output As #2
    Do Until EOF(1)
    Line Input #1, s
    s = Replace(s, Chr(9), ";")
    Print #2, s
    Loop
    Close 1
    Close 2
    InputFile = Dir
  Loop

  i = 0
  InputFile = Dir(Mappe & "fil*.csv")
  Do Until InputFile = ""
    i = i + 1
    DoCmd.TransferText acImportDelim, , "NyTabel" & i, Mappe & InputFile, True
    InputFile = Dir
  Loop
End Sub
Avatar billede moso Nybegynder
26. november 2008 - 15:27 #6
kan samme løsning bruges i excel?
Avatar billede fdata Forsker
26. november 2008 - 15:31 #7
Microsoft påstår jo, at VBA (Visual Basic for Applications) i store træk skulle være den samme på tværs af Office pakken, så der burde være en rimelig chance; men bemærk lige, at koden opretter tabeller. Det har du jo ikke i Excel.
Hvis du vil oprette et Excel ark pr. tekstfil, kunne du jo vælge at eksportere de nye tabeller til Excel med DoCmd.TransferSpreadsheet i samme hug.
Avatar billede moso Nybegynder
26. november 2008 - 15:35 #8
Jeg vil helst kunne pege på en mappe, og derved hente alle textfiler i mappen ind i seperate sheets, navngivet efter txt-filens navn...
Avatar billede fdata Forsker
26. november 2008 - 15:51 #9
Så kører vi med den udvidede model:

Sub ImporterFlereFiler()
  Const Mappe = "C:\Temp\"
  Const FilFilter = "fil*"
 
  Const TempTabelNavn = "TempTabel"
 
  Dim InputFile As String
  Dim OutputFile As String
  Dim i As Integer
  Dim s As String
 
  InputFile = Dir(Mappe & FilFilter & ".txt")
  Do Until InputFile = ""
    OutputFile = Replace(InputFile, ".txt", ".csv")
    Open Mappe & InputFile For Input As #1
    Open Mappe & OutputFile For Output As #2
    Do Until EOF(1)
    Line Input #1, s
    s = Replace(s, Chr(9), ";")
    Print #2, s
    Loop
    Close 1
    Close 2
    InputFile = Dir
  Loop

  InputFile = Dir(Mappe & FilFilter & ".csv")
  Do Until InputFile = ""
    OutputFile = Replace(InputFile, ".csv", ".xls")
    On Error Resume Next
    CurrentDb.TableDefs.Delete TempTabelNavn
    On Error GoTo 0
    DoCmd.TransferText acImportDelim, , TempTabelNavn, Mappe & InputFile, True
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, TempTabelNavn, Mappe & OutputFile, True
    Kill Mappe & InputFile
    InputFile = Dir
  Loop
End Sub
Avatar billede moso Nybegynder
26. november 2008 - 15:57 #10
Har prøevet at køre den, men der sker ikke noget. Hvis jeg ændrer 
Const FilFilter = "fil*"
til
Const FilFilter = "*"

Der genereres en del csv-filer, men derefter kommer der en 424-fejl "object required"?
Ser ud til at den ikke fanger de nye filer eller hvad?
Avatar billede moso Nybegynder
26. november 2008 - 15:58 #11
Crap. Beklager det gik lidt stærkt:

Jeg har ændret

Const FilFilter = "fil*"
til
Const FilFilter = "*"

ellers kører den uden resultat.
Avatar billede fdata Forsker
26. november 2008 - 16:02 #12
... og betyder det, at alt er ok?
Avatar billede moso Nybegynder
26. november 2008 - 16:05 #13
Desværre. Jeg får genereret alle csv-filerne, men de bliver ikke importeret i excel som individuelle sheets.
Prøver lige igen:
med fil* sker der ingenting
med * genereres csv filerne i mappen, men kommer en 424 fejl "Object Required" og der er dermed ingen import til excel.
Giver det mere mening?
Håbet var at de enkelte csv-filer importeres i hver deres sheet i excel...
Avatar billede fdata Forsker
26. november 2008 - 16:10 #14
Kort forklaret:
- rutinen gennemløber .txt filerne og danner .csv filer
- derefter indlæses .csv filerne og der eksporteres tilsvarende .xls filer
Det kører helt fint her.

Hvis ikke det kører hos dig, lugter det af at der måske kunne være "fremmede" .txt eller .csv filer, der bliver blandet ind i legen.
Er mappen tom bortset fra .txt filerne?
I hvilken linie opstår fejlen?

(NB: Er lige nødt til at løbe en times tid - tjekker status ved 17-tiden)
Avatar billede moso Nybegynder
26. november 2008 - 16:24 #15
Tror måske vi snakker forbi hinanden her.
Jeg kan få koden til at lave csv'er af alle textfilerne, men jeg får ikke noget ind i excel-arket.
Prøvet lige med et simpelt eksempel:
har to txt-filer (navne.txt og byer.txt) med tabulator sepereret data. De skal importeres ind i hver deres sheet i excel-arket, som derefter navngives efter samme navne som txtfilerne.
Den kode du har smidt til mig (som jeg er taknemmelig for ;-)) giver mig en konvertering af txt til csv, men flytter ikke data over i excel-arket.

Jg tror der er en fejl i den måde jeg måske bruger koden på for den løbes ikke helt igennem men opretter csv-filerne og smider derefter en fejl som nævnt ovenfor.

Håber det giver mening.
Avatar billede moso Nybegynder
26. november 2008 - 16:40 #16
Det ser ud til at fejlen kommer i denne linie:

  DoCmd.TransferText acImportDelim, , TempTabelNavn, Mappe & InputFile, True
Avatar billede moso Nybegynder
26. november 2008 - 16:43 #17
og igen i denne:
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, TempTabelNavn, Mappe & OutputFile, True

Måske der er noget i TempTabelNavn?
Avatar billede moso Nybegynder
26. november 2008 - 17:09 #18
Har kigget lidt videre. Det hænger vel sammen med at DoCmd.* er beregnet til Access og derfor fejler i Excel...

Jeg kan dog køre den i Access, men her er resultatet ikke som håbet. Der oprettes een tabel, med indholdet i de enkelte filer listet op på samme række.

Lukker ned for idag, men kigger videre imorgen igen. Er klar over at spørgsmålet ikke længere hører hjemme under databaser, men ved ikke helt hvordan jeg skal flytte det...
Avatar billede fdata Forsker
26. november 2008 - 17:52 #19
Ja, så taler vi virkelig forbi hinanden. Min kode er stadig til Access. Den opretter - som forklaret - en .xls fil pr. .txt fil.
Jeg forstår nu, at du vil have et sheet pr. .txt fil i een eneste Excel fil. Den ide havde jeg helt udelukket, idet dit spm. sagde "... der er mange filer (+150)..." Kan Excel håndtere flere hundrede faner/sheets i den samme fil?

Men, ok. Her er en version, der smider alle filerne ind i særskilte sheets i en Excelfil (ret selv parametrene):
(BEMÆRK: Vi er stadig i Access!!!)


Sub ImporterFlereFiler()
  Const Mappe = "C:\Temp\"
  Const FilFilter = "fil*"
  Const ResultatFil = "Resultat.xls"
 
  Dim TempTabelNavn As String
 
  Dim InputFile As String
  Dim OutputFile As String
  Dim i As Integer
  Dim s As String
 
  InputFile = Dir(Mappe & FilFilter & ".txt")
  Do Until InputFile = ""
    OutputFile = Replace(InputFile, ".txt", ".csv")
    Open Mappe & InputFile For Input As #1
    Open Mappe & OutputFile For Output As #2
    Do Until EOF(1)
    Line Input #1, s
    s = Replace(s, Chr(9), ";")
    Print #2, s
    Loop
    Close 1
    Close 2
    InputFile = Dir
  Loop

  InputFile = Dir(Mappe & FilFilter & ".csv")
  Do Until InputFile = ""
    TempTabelNavn = Left(InputFile, Len(InputFile) - 4)
    On Error Resume Next
    CurrentDb.TableDefs.Delete TempTabelNavn
    On Error GoTo 0
    DoCmd.TransferText acImportDelim, , TempTabelNavn, Mappe & InputFile, True
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, TempTabelNavn, Mappe & ResultatFil, True
    Kill Mappe & InputFile
    InputFile = Dir
  Loop
End Sub
Avatar billede fdata Forsker
26. november 2008 - 17:58 #20
FYI: Har lige tjekket nettet. Der lader ikke til at være en øvre grænse for antal sheets. Det er tilsyneladende mængden af RAM, der afgør det. Hm.
Avatar billede moso Nybegynder
26. november 2008 - 18:55 #21
Super - tjekker det senere. I praksis er filerne (.txt) placeret i forskellige mapper, så der er tale om en import af max 20 filer adgangen, hvilket betyder at udfordringen i excel ikke burde skabe problemer.
Har du input til en løsning der importerer det til excel. Jeg har idag fikset en Macro-eksport der "går den anden vej" til excel, men kan ikke eksportere på samme måde fra Access.
Forstår ikke helt denne her dog:

Men, ok. Her er en version, der smider alle filerne ind i særskilte sheets i en Excelfil (ret selv parametrene):
(BEMÆRK: Vi er stadig i Access!!!)

Takker indtil nu for dine input :-)
Avatar billede moso Nybegynder
26. november 2008 - 19:11 #22
Har lige testet det. Super!!!
Enkelt problem dog - det skal importeres som tabulator ikke kommasepareret.
Er det til at fikse?
Avatar billede fdata Forsker
26. november 2008 - 19:40 #23
Hvad forstår du ikke m.h.t. "en version, der smider alle filerne ind i særskilte sheets i en Excelfil"?
Koden gør præcis det, som du efterlyste. Importerer data fra en række tabulatorseparerede filer og samler dem i en Excel fil. Hver fil på sit eget sheet med et navn, der svarer til filens. Har du overhovedet testet koden?

Ikke forstået: "det skal importeres som tabulator ikke kommasepareret".
Når først data er landet i Excel, kan du da ikke se, hvordan de blev importeret.
Og filerne er jo tabulatorseparerede.

Prøv lige at forklare lidt nærmere inden vi ryger ud ad to forskellige tangenter.
Jeg frygter lidt at jeg udvikler i Access og du tester i Excel.
Avatar billede moso Nybegynder
26. november 2008 - 19:49 #24
Hej fdata. Beklager forvirringen. Har testet det og får data ind i hhv. Access og Excel. Desværre samles al data i det først felt, hvor det gerne skulle deles for hvert tabulator mellemrum.
En linie som efter importen ser dermed ud som denne (i både Access og Excel):

ACCOUNT;40030;Consultants;Control;P&L;;EUR;Subcontractors;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1

For hvert ; skal data "rykke" videre til næste kolonne.

Men du har ret: Jeg leder mere og mere efter at vi kan komme uden om Access - hvis resultatet kan komme
direkte over i excel uden brug af Access er det fint med mig. Tak for din tålmodighed og beklager hvis jeg ikke er helt klar i hvad der er målet.
Avatar billede kabbak Professor
26. november 2008 - 22:41 #25
prøv at teste denne til excel

Public Sub Hent_filer()
    Dim FileFind() As Variant, X As Integer, MyPath As String, MyName As String, Res As Variant
    Dim I As Long, Fil As String, Linje As String
    X = 0
    MyPath = "c:\Data\"    'Ret til din sti.
    MyName = Dir(MyPath & "*.txt", vbDirectory)    ' Retrieve the first entry.
    ReDim FileFind(X)
    FileFind(X) = MyName
    Do While MyName <> ""    ' Start the loop.
        X = X + 1
        ReDim Preserve FileFind(X)
        ' Ignore the current directory and the encompassing directory.
        If MyName <> "." And MyName <> ".." Then
            ' Use bitwise comparison to make sure MyName is a directory.
        End If
        MyName = Dir    ' Get next entry.
        FileFind(X) = MyName
    Loop

    For X = 0 To UBound(FileFind) - 1

        Fil = Split(FileFind(X), ".")(0)
        Worksheets.Add
        ActiveSheet.Name = Fil

        Open MyPath & FileFind(X) For Input As #1
        I = 1
        Do Until EOF(1)
            Line Input #1, Linje
            If Linje <> "" Then
                Res = Split(Linje, vbTab)
                Range(Cells(I, 1), Cells(I, UBound(Res) + 1)) = Res
                I = I + 1
            End If
        Loop
        Close 1
    Next
End Sub
Avatar billede moso Nybegynder
27. november 2008 - 09:07 #26
kabbak: Det ser ud til at virke. Tester det lige endnu engang her til morgen. Opretter et spørgsmål under excel og beder dig svare på det (Smider link her når det er oprettet). Der er ovenfor to spørgsmål, med hver deres svar: Point til begge...
fdata: Jeg fik ikke det til at køre helt i Access, der er problemer med opdelingen af linerne. Prøver at kigge på det også og vender tilbage senere.
Avatar billede fdata Forsker
27. november 2008 - 12:38 #27
Det er helt ok, at du vil gå udenom Access. Dit spørgsmål (i Access kategorien), som lød "Jeg har behov for at importere flere .txt-filer til access" antydede jo bare noget andet  ;o))

For lige at runde vores lille øvelse af:
Linierne burde blive splittet op under importen til Access (i linien DoCmd.TransferText acImportDelim).
Delim er normalt et semikolon. Har du ændret det - eller sidder du måske med en engelsk Office?

Jeg overlader dig i trygge hænder hos kabbak.
Avatar billede moso Nybegynder
27. november 2008 - 12:52 #28
fdata: Først og fremmest: Tak for hjælpen.

Delim er i mine felter tabulator, og ja, jeg sidder med en engelsk version.

Lukker ned her, men tror jeg kan bruge lidt at din løsning (konverter til csv) og point for svaret.

kabbak: Smid dit svar her http://www.eksperten.dk/spm/854406 og der er point til dig også. Tak for indsatsen.
Avatar billede fdata Forsker
27. november 2008 - 14:51 #29
Hm. Havde jeg vidst det, kunne jeg jo let have ændret koden. Vi skulle bare droppe konverteringen og gå direkte til indlæsningen. Nå, pyt. Det vigtigste er at det spiller.
Takker for point  ;o)
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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