06. februar 2008 - 12:38Der er
17 kommentarer og 1 løsning
Import fra en *.txt fil og dataformat
Jeg har en stor tekstfil jeg gerne hver uge skal have importeret til Access. Jeg ville helst gøre det med et VBscript, men er ikke stærk i hvordan det gøres. Kan dog forstå den slags kode.
En anden mulighed er at linke til tekstfilen via "sammenkæd tabeller", dette giver mig dog et problem med dataformaterne i filen til access. Der er nogle datofelter som står i tekstfilen som "yyyymmdd", det tolker databasen som tekst og vil ikke modtage det som en dato.
After you link the text file you can then make a query which converets the text date field to a valid date. Waht do you want to do with the file after it is imported/linked?
NavnPåImportSpecifikation får du ved at køre en manuel import og tryk på knappen Avanceret, når din import er sat op, som du vil have det. Under Avanceret er der flere indstillinger og en gem som knap. Det du gemmer er din import specifikation!~)
Efter filen er linket ind kører jeg en INSERT INTO forespørgsel som trækker data fra den sammenkæddede fil over i en almindelig tabel. Det er det der er hele problemstillingen, bare hvordan man får data fra en tekstfil ind i access og teksten er sepereret med "]".
Jeg er ikke umiddelbart klar over hvor jeg skal køre: Dateserial(Left("20070120", 4), Mid("20070120",5,2), Right("20070120",2)) ??
Jeg går ud fra at du forstår dansk? Ellers skriver jeg gerne engelsk.
Jeg er interesseret i at gøre denne process 100% automatiseret, derfor ingen junglering i excel, her er også tale om over én millien linier, så det er ikke muligt med excels 64000.
Ja jeg sidder med import wizarden nu, bare åndsvagt at den tekstbox der tilbyder en valgmulighederne på imporspecifikation er for lille til at vise det fulde navn! (typisk MS).
Jeg kan godt få den til at brydde dato'en op og sammensætte det i et nyt felt, er der ingen måde at at skrive til samme feltnavn, så man ikke skal til at tilføje attributter i tabellen for at få den til at kunne håndtere det. Det vil også betyde en del omstrukturering at efterfølgende procedure.
"..åndsvagt at den tekstbox der tilbyder en valgmulighederne på imporspecifikation ..."
Not sure what you mean here, an import specification makes it possible to save the import and us eit later in code so that you dont need to use the wizard again.
I would suggest the following.
Using the Wizard import the data into a TEMP table and save the import as a specification for later use.
Once that is working make a query which converts your dat aso that it can be imported into the correct table.
Once this works we can then make some code which automates it all.
mens du skrev din fine kommentar fant jeg ud af at jeg selv kunne navngive en specifikation. Og den kunne faktisk formattere datoformatet korrekt. Nu er det bare at lave et VBAscript der kan køre det, og det har jeg styr på - sort of ;-)
Tekstfilen der skal importeres ligger altid det samme sted, og hedder det samme navn. Så det jeg skal lave en egentlig en "DROP TABLE"-funktion der smidder den gamle tabel ud og derefter opretter en ny. Derefter er det faktisk bare at at køre en "INSERT INTO"-forespørgsel som hiver data fra den sammenkædede tekstfil ind i den nye tabel.
Hvis du er sej i VBA må du gerne give et bud, jeg kvittere gerne med points, da det ligger udover det indeværende spørgsmål.
Jeg forsøgte med et lille VBscript via HTML, og det virker, men det er MEGET langsomt, og vil ikke være hurtigt nok i denne sammenhæng hvor mængden af data overstiger 1.000.000 poster.
Vedligger koden, hvis det skulle have interese
<html> <head> <script LANGUAGE="VBSCRIPT">
function import_1()
Dim start start = 0 Dim fsoObject Dim filObject Dim tsObject Dim strBuffer Dim objConn, objRS,Sql set objConn=CreateObject("ADODB.Connection") set objrs=CreateObject("ADODB.Recordset") objConn.Open ="Provider=Microsoft.Jet.Oledb.4.0;data source= StiOgFilnavn"
Const ForReading = 1 Const TristateFalse = 0
Set fsoObject = CreateObject("Scripting.FileSystemObject") file = "StiogFilnavn" set tsObject = fsoObject.OpenTextFile(file) do While Not tsObject.AtEndOfStream
strLine = tsObject.ReadLine if start <> 0 then Dim strdate1 Dim strAryWords strAryWords = Split(strLine, "]") sql = "INSERT INTO [TABELNAVN([id],[Segment],[Center],[Gruppe],[Primær ansvarlig],[Produkt],[Tillægsprodukt],[Salgstrin],[Dato salgstrin],[Sandsynlighed],[Oprettet],[Oprettet Center],[Overført],[Overført af],[Kilde],[Svartype],[Nettobeløb],[Bruttobeløb],[Adresse],[Postnr],[PotentialeID],[Cprno],[Klassifikation]) values ('"&strAryWords(0)&"','"&strAryWords(1)&"','"&strAryWords(2)&"','"&strAryWords(3)&"','"&strAryWords(4)&"','"&strAryWords(5)&"','"&strAryWords(6)&"','"&strAryWords(7)&"',#"&left(strAryWords(8),4)+"-"+mid(strAryWords(8),5,2)+"-"+right(strAryWords(8),2)&"#,'"&strAryWords(9)&"',#"&left(strAryWords(10),4)+"-"+mid(strAryWords(10),5,2)+"-"+right(strAryWords(10),2)&"#,'"&strAryWords(11)&"','"&strAryWords(12)&"','"&strAryWords(13)&"','"&strAryWords(14)&"','"&strAryWords(15)&"','"&strAryWords(16)&"','"&strAryWords(17)&"','"&strAryWords(18)&"','"&strAryWords(19)&"','"&strAryWords(20)&"','"&strAryWords(21)&"','"&strAryWords(22)&"')" set objrs=objconn.execute(sql) end if start = 1 loop
I'm a bit puzzled. We've been talking Access and VBA but you want an answer to VBScript, what import wizard you you been looking at, I didnt know there was one in VBScript?
Nej vi snakker om det samme, det er bare lige det kigger lidt længere nu.
Vi har snakket om Access og dennes import wizard, og hvordan man sammenkæder en tekstfil ind i Access og hvordan man den vej får det rigtige datoformat. Det virker og jeg har nettop importeret en million poster på 5 minutter, så performance er fin.
VBscript var kun fordi min kollega og jeg har brugt dagen på at få denne import til at fungere, han forsøgte med VBscript (ovenstående kode) og jeg brugte tiden på at finde en måde at sammenkæde og importere denne vej (det du har hjulpet med). Resultater er pt at jeg sammenkæder tekstfilen ind i Access, derefter kører jeg en række forespørgsler der sletter en tabel, opretter en ny og derefter importere data. Du har været en stor hjælp. Det eneste jeg mangler bare at lave en makro som gør alt det i ét tryk :-)
TEMP table name Name of import specification names of queries you need to run
You can use something like this in a code module
DoCmd.RunSQL "DELETE * FROM YourTempTable" DoCmd.TransferText acImportDelim, "NameOfImportSpecGoesHere" 'Dont think any other paramaters are needed
DoCmd.OpenQuery "NameOfQueryGoesHere"
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.