Avatar billede balk Nybegynder
06. februar 2008 - 12:38 Der 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.

Nogle ideer?
Avatar billede terry Ekspert
06. februar 2008 - 12:55 #1
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?
Avatar billede terry Ekspert
06. februar 2008 - 12:58 #2
You can use something like this to convert the string to a date

Dateserial(Left("20070120", 4), Mid("20070120",5,2), Right("20070120",2))
Avatar billede terry Ekspert
06. februar 2008 - 12:58 #3
and you would obviously replace the string in the example with ethe name of the field in the table.
Avatar billede Slettet bruger
06. februar 2008 - 12:59 #4
Ang. importen....

DoCmd.TransferText acExportDelim,"NavnPåImportSpecifikation","TabelNavn","StiOgFilNavnHusk.txt","True/False OmNavnePåFelterErFørsteLinieITekstfil"

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!~)
Avatar billede balk Nybegynder
06. februar 2008 - 13:03 #5
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.
Avatar billede terry Ekspert
06. februar 2008 - 13:07 #6
Yes I understand Danish, just to lazy to write.

If you make a query which selects all of the fields you want imported then it would look something like this

SELECT fld1, fld2, Dateserial(Left(fld3, 4), Mid(fld3,5,2), Right(fld3,2)) AS DateFld FROM YourTable
Avatar billede terry Ekspert
06. februar 2008 - 13:07 #7
You could very likely do it all in one SQL to

INSERT INTO ..... SELECT ......
Avatar billede terry Ekspert
06. februar 2008 - 13:09 #8
"... teksten er sepereret med "]"...."

When you import a text file using the import wizard you can (I think) choose which character is used as the field seperator.

You need to press the Advanced button in the wizard
Avatar billede jokkejensen Novice
06. februar 2008 - 13:36 #9
Smid txt filen i excel, og exporter den til noget CSV som Access let læser.

/JJ
Avatar billede balk Nybegynder
06. februar 2008 - 13:40 #10
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.
Avatar billede terry Ekspert
06. februar 2008 - 13:43 #11
have you tried th eimport wizard and the Advanced button?
Avatar billede balk Nybegynder
06. februar 2008 - 14:02 #12
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.
Avatar billede terry Ekspert
06. februar 2008 - 14:24 #13
"..å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.
Avatar billede balk Nybegynder
06. februar 2008 - 14:44 #14
ahhh :-)

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

msgbox("Opdatering fuldført... DUN!")

end function

</script>
<title>Untitled Document</title>
</head>
<body>
<input type="button" value="test" onclick="import_1()">
</body>
</html>
Avatar billede terry Ekspert
06. februar 2008 - 14:53 #15
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?
Avatar billede balk Nybegynder
06. februar 2008 - 15:18 #16
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 :-)
Avatar billede balk Nybegynder
06. februar 2008 - 15:18 #17
Jeg beklager hvis jeg fik forvirret dig.
Avatar billede terry Ekspert
06. februar 2008 - 15:41 #18
can you give a bit more info?

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"
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