26. november 2008 - 10:58Der 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.
Det gør virkelig en forskel at bruge professionel hardware, hvad enten det er til videoproduktion, AI-udvikling eller High Performance Computing.
20. december 2024
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
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.
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
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.
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
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...
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)
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.
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...
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!!!)
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
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!!!)
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.
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):
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.
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
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
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.
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?
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)
Synes godt om
Ny brugerNybegynder
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.