Avatar billede taio Novice
30. november 2005 - 19:42 Der er 15 kommentarer og
1 løsning

Impotere data fra txt-fil

Hej alle eksperter

Jeg sidder med en lille opgave, jeg har en tekst fil, med følgende data:
5  15  25
5  25  125
Mellemrum er tabulator.

Disse data vil jeg gerne fra access kunne importere ind i en tabel. Har en formular jeg kan køre en kode fra.

Hjælp

Taio
Avatar billede kabbak Professor
30. november 2005 - 22:49 #1
prøv at se på dette

DoCmd.TransferText ([TransferType], [SpecificationName], [TableName], [FileName], [HasFieldNames], [HTMLTableName], [CodePage])
Avatar billede taio Novice
30. november 2005 - 23:52 #2
Kan du ikke prøve at sende et eksempel, er lidt i tvivl hvordan det skrives og havad der skrives...!
Avatar billede jesperfjoelner Nybegynder
01. december 2005 - 02:20 #3
som Kabbak siger kan du bruge Docmd.Transfertext som er bygget til hurtig import.

Har du tre felter i din tabel? Er det nummerfelter?

Du kan også læse gennem filen og importere således:
(læg denne kode bag en knap).

Dim intFileNo As Integer
Dim strLine As String
Dim arr() As String
Dim db As Database

intFileNo = FreeFile()
Open "C:\1.txt" For Input As #intFileNo
Set db = CurrentDb
' Læs alle linjer
Do While Not EOF(intFileNo)
    Line Input #intFileNo, strLine
    arr = Split(strLine, " ")
    db.Execute ("INSERT INTO tabel1 (felt1,felt2,felt3) VALUES (" & arr(0) & "," & arr(1) & "," & arr(2) & ")"), dbFailOnError
Loop

Erase arr
Close #intFileNo
Avatar billede taio Novice
01. december 2005 - 07:50 #4
Hej Jesper

Den fejler på følgende linje:
db.Execute ("INSERT INTO t_status (Kode,statusvarenr,statusantal) VALUES (" & arr(0) & "," & arr(1) & "," & arr(2) & ")"), dbFailOnError

Hvor:
t_status = min tabel
Kode,statusvarenr,statusantal = feltnavne
Avatar billede kabbak Professor
01. december 2005 - 08:23 #5
Her er der en jeg bruger, filen er komma separeret
Filen omdøbes til en .txt fil inden import
Public Function hent()

Dim fil As String, Sti As String
Sti = Application.CurrentProject.Path
Name Sti & "\New_CARBOE.dat" As Sti & "\New_CARBOE.txt"
fil = Sti & "\New_CARBOE.txt"
DoCmd.SetWarnings False
DoCmd.TransferText acImportDelim, "New_CARBOE importspecifikation", "CARBOE", fil, False, , 865
DoCmd.SetWarnings True
Name Sti & "\New_CARBOE.txt" As Sti & "\New_CARBOE.dat"
End Function
Avatar billede jesperfjoelner Nybegynder
01. december 2005 - 13:20 #6
taio > Du skal have en reference til DAO 3.6 har du det?
I VBA-editoren gå da til Tools > Rerences > og find Microsoft DAO 3.6 og vælg den.
Kør det så igen. Virker det?

Hvad siger fejlen?

Dette virker hos mig:

Dim intFileNo As Integer
Dim strLine As String
Dim arr() As String
Dim db As Database

intFileNo = FreeFile()
Open "C:\1.txt" For Input As #intFileNo
Set db = CurrentDb
' Læs alle linjer
Do While Not EOF(intFileNo)
    Line Input #intFileNo, strLine
    arr = Split(strLine, " ")
    db.Execute ("INSERT INTO t_status (kode,statusvarenr,statusantal) VALUES (" & arr(0) & "," & arr(1) & "," & arr(2) & ")"), dbFailOnError
Loop
Erase arr
Close #intFileNo
Avatar billede overchord Nybegynder
01. december 2005 - 13:30 #7
fremfor at bruge db.Execute (...) proev med Docmd.RunSQL(...)
Det er en god ide at slukke for advarsler saa du undgaar en popup box for hver linje:
docmd.setwarnings(false)
docmd.runsql("INSERT INTO t_status (kode,statusvarenr,statusantal) VALUES (" & arr(0) & "," & arr(1) & "," & arr(2) & ")")
docmd.setwarnings(true)
Avatar billede jesperfjoelner Nybegynder
01. december 2005 - 14:49 #8
db.execute er bedre end docmd.runsql

For det første slipper man for at "slukke" for advarslerne. Risikoen ved dette er at koden fejl ved en INSERT, hvorefter fejlmeddeleser er slukket i hele databsen.

db.execute med endelsen "dbFailOnError" giver også mere deskriptive fejlmeddelser om f.eks. nøglekonflikter.

og så andre tidligere har skrevet:

"db.Execute may be marginally faster but I doubt it is an observable
difference.
The *major* difference is that Execute returns trappable JET error if you
want to use error-trapping. "
Avatar billede jesperfjoelner Nybegynder
01. december 2005 - 14:57 #9
Lige en anden kommentar til dette, selv om det kan ende med at være at lidt akademisk interesse :-)

"It is a good idea to Set db = CurrentDb() because you can
then use the RecordsAffected property to find out how many
records were added, deleted or modified. Certainly it's
somewhat faster to use the Set db ... if you are going to
Execute a sequence of action queries.

Note that Execute requires you to resolve any query
parameters in your code before executing the query. OTOH,
when Access processes the RunSQL method it will take care of
the parameters for you.

All this is mostly irrelevant if you really need to improve
performance. As far as query performance is concerned you
can gain orders of magnitude better improvement by making
sure you have all the Join, Where and Order By fields
indexed (but don't duplicate the automatic index on a
foreign key used in a Relationship). Another important
thing is to remove any **unnecessary** keywords such as
DISTINCT, etc.
Avatar billede jesperfjoelner Nybegynder
01. december 2005 - 14:59 #10
Som nævnet ikke de store hastighedsforskelle på db.execute og Docmd.RunSQL.

Jeg har lige lavet en test med en textfil med 100.000 poster hvor:

...
BeginTrans
Do While Not EOF(intFileNo)
    Line Input #intFileNo, strLine
    arr = Split(strLine, " ")
    db.Execute ("INSERT INTO t_status (kode,statusvarenr,statusantal) VALUES (" & arr(0) & "," & arr(1) & "," & arr(2) & ")"), dbFailOnError
Loop
CommitTrans
...

var endnu hurtigere (omkring 30%).

Det skyldes jo at når man 'wrapper' et loop i en transaction, så skrives der først til harddisken når det hele er færdigt, hvorimod derellers skrives 100.000 gange.
Avatar billede taio Novice
01. december 2005 - 17:19 #11
Fejl = Run-time error 9, "subscript out of range"

    db.Execute ("INSERT INTO t_status (kode,statusvarenr,statusantal) VALUES (" & arr(0) & "," & arr(1) & "," & arr(2) & ")"), dbFailOnError
Avatar billede jesperfjoelner Nybegynder
01. december 2005 - 17:24 #12
Det må være noget med at der i enden af dine linjer et ekstra mellem.
Eller er der nogen linjer, hvor der kun er 2 tal?
4 6 7
5 6 7
5 6
7 8 9

?

virker det hvis du retter:
Line Input #intFileNo, strLine

til
Line Input #intFileNo, trim(strLine)
Avatar billede jesperfjoelner Nybegynder
01. december 2005 - 17:25 #13
nej prøv i stedet:

arr = Split(strLine, " ")

ret til:

arr = Split(trim(strLine), " ")
Avatar billede jesperfjoelner Nybegynder
01. december 2005 - 17:42 #14
hvis du vil kan du også sende mig et eksempel inkl. teksfil på
jesperfjoelner snabela hotmail punktum com

du kan bare lige omdøbe mdb-filen til .txt (ellers æder hotmails spamfilter den).
Så skal jeg gerne prøve at se om jeg kan få det til at virke.
Avatar billede taio Novice
01. december 2005 - 19:37 #15
Du får point for din stabile hjælp, men jeg har lavet det i en macro. Tak for hjælpen.
Avatar billede jesperfjoelner Nybegynder
01. december 2005 - 20:45 #16
OK, mange tak. Godt det virker, ellers skal du være velkommen til at sende noget :-)
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