[ASP] Bestand importeren

Pagina: 1
Acties:

  • Dutch_guy
  • Registratie: September 2001
  • Laatst online: 20-04 14:47
Ik wil een bestand importeren in een database dat de volgende structuur heeft: http://www.xs4all.nl/~uwsite/got/sample.txt

Nu is het zo dat ik alleen de regels wil importeen die beginnen met "001".

De volgende code gebruik ik om dit te realiseren:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
set rsInsert = Server.CreateObject("ADODB.Recordset")
rsInsert.Open "Select * From Import" , Conn, adOpenKeyset, adLockOptimistic, adCmdText

ImportBestand = Request.Form("file")
Set fs=Server.CreateObject("Scripting.FileSystemObject")
Set f=fs.OpenTextFile (ImportBestand , 1)


Do While Not f.AtEndOfStream

klantinformatie    = (f.Read(3))
f.readline

If klantinformatie = "001" then
    beginklant      = (f.Read(4))
    regelklant        = (f.readline)
    regelimport       = split(regelklant,"$")

rsInsert.AddNew
    For i = 0 To UBound(regelimport)
        rsInsert("veld" & i) = regelimport(i)
        
        no = no + 1
    Next
rsInsert.Update
End If

Loop


Echter hij importeert dan niet de "001" regel, maar de volgende regel.

Nu kan ik wel "001" vervangen met de voorgaande "098" regel, echter die staat niet altijd vooraf aan een "001" regel.

Wat gaat hier fout ?

Pay peanuts get monkeys !


  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

wat doet die f.readline op regel 12?

Today's subliminal thought is:


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
bekijk regel 11 en 12 eens goed :)

enne... if left(klantinformatie,3)="001" om te checken of de regel begint met 001...

[ Voor 74% gewijzigd door RobIII op 25-03-2004 18:05 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Dutch_guy
  • Registratie: September 2001
  • Laatst online: 20-04 14:47
Ik heb dus steeds 1 regel teveel ingelezen.

De oplossing:

code:
1
2
3
4
klantinformatie    = f.Readline

If Left(klantinformatie,3) = "001" then
    regelimport       = split(klantinformatie,"$")

Pay peanuts get monkeys !


  • Dutch_guy
  • Registratie: September 2001
  • Laatst online: 20-04 14:47
Iedere "001" regel heeft een bijbehorende "098" regel. Die "098" regel wil ik graag toevoegen aan ieder bijbehorend record. Zowel "001" als "098" bevatten beide eenzelfde unieke nummer.

Ik heb het nu als volgt opgelost, maar volgens mij is dit hartstikke inefficient.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
set rsInsert = Server.CreateObject("ADODB.Recordset")
rsInsert.Open "Select * From Import" , Conn, adOpenKeyset, adLockOptimistic, adCmdText

ImportBestand = Request.Form("file")
Set fs=Server.CreateObject("Scripting.FileSystemObject")
Set f=fs.OpenTextFile (ImportBestand , 1)


Do While Not f.AtEndOfStream

klantinformatie    = f.Readline

If Left(klantinformatie,3) = "001" then
    regelimport       = split(klantinformatie,"$")

rsInsert.AddNew
    For i = 0 To UBound(regelimport)
        rsInsert("veld" & i) = regelimport(i)
    Next
rsInsert.Update
End If

Loop

f.Close

Set f  = Nothing
Set fs = Nothing

rsInsert.Close
Set rsInsert = Nothing

'---------------------- Hier begint de 2e import ----------------------
 
ImportBestand = Request.Form("file")
Set fs=Server.CreateObject("Scripting.FileSystemObject")
Set f=fs.OpenTextFile (ImportBestand , 1)


Do While Not f.AtEndOfStream

klantinformatie    = f.Readline

If Left(klantinformatie,3) = "098" then
    regelimport       = split(klantinformatie,"$")
    sleutel           = (f.Skip(4))
    sleutel2          = (f.Read(9))

set rsInsert = Server.CreateObject("ADODB.Recordset")
rsInsert.Open "Select * From Import Where veld1='" & sleutel2 & "'", Conn, adOpenKeyset, adLockOptimistic, adCmdText

    For i = 0 To UBound(regelimport)
        rsInsert("veld21") = regelimport(0)
        rsInsert("veld22") = regelimport(1)
        rsInsert("veld23") = regelimport(2)
        rsInsert("veld24") = regelimport(3)
        rsInsert("veld25") = regelimport(4)
        rsInsert("veld26") = regelimport(5)
        rsInsert("veld27") = regelimport(6)
    Next
rsInsert.Update
End If

Loop

f.Close

Set f  = Nothing
Set fs = Nothing

rsInsert.Close
Set rsInsert = Nothing


Ik open hier dus ook nog eens 2 keer het bestand en 2 keer een recordset.

Hoe kan ik in 1 keer zowel regel "098" als "001" importeren naar 1 record op een snellere manier.

Bij grotere bestanden, krijg ik nu ook een error dat de maximale uitvoeringstijd is overschreden.

[ Voor 11% gewijzigd door Dutch_guy op 26-03-2004 12:10 ]

Pay peanuts get monkeys !


  • Dutch_guy
  • Registratie: September 2001
  • Laatst online: 20-04 14:47
Iemand nog een idee hoe ik bovenstaande code kan optimaliseren?

Pay peanuts get monkeys !


Verwijderd

Ik zou er zoiets van maken:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
'Er bestaat al een connectie object naar de DB met de naam Conn

'Variabelen declareren
Dim sleutel, klanteninformatie, regelimport, ImportBestand, fs, f, SQL, i

'Open het bestand
ImportBestand = Request.Form("file")
Set fs=Server.CreateObject("Scripting.FileSystemObject")
Set f=fs.OpenTextFile (ImportBestand , 1)

'Loop totdat file leeg is
Do While Not f.AtEndOfStream
    klantinformatie    = f.Readline
    
    ' klantsoort 001
    If Left(klantinformatie,3) = "001" then
    regelimport = split(klantinformatie,"$")
    ' bouw SQL statement
        SQL = "INSERT INTO Import VALUES ("
        For i = 0 To (UBound(regelimport) - 1)
        SQL = SQL & regelimport(i) & ", "
        Next
        SQL = SQL & regelimport(UBound(regelimport)) & ")"
        
    ' klantsoort 098
    ElseIf Left(klantinformatie,3) = "098" then
        regelimport = split(klantinformatie,"$")
        f.Skip(4)
        sleutel = (f.Read(9))
        ' bouw SQL statement
        SQL = "UPDATE Import SET " &
        SQL = SQL & "veld21 = '" & regelimport(0) & "', "
        SQL = SQL & "veld22 = '" & regelimport(1) & "', "
        SQL = SQL & "veld23 = '" & regelimport(2) & "', "
        SQL = SQL & "veld24 = '" & regelimport(3) & "', "
        SQL = SQL & "veld25 = '" & regelimport(4) & "', "
        SQL = SQL & "veld26 = '" & regelimport(5) & "', "
        SQL = SQL & "veld27 = '" & regelimport(6) & "' "
        SQL = SQL & "WHERE veld = '" & sleutel & "'"

    Else
        'geen SQL opdracht
        SQL = ""
        
    EndIf
    
    'execute de SQL code
    If SQL <> "" then
        Conn.execute(SQL)
    EndIf

Loop

' File sluiten, opjecten dumpen
f.Close
Set f  = Nothing
Set fs = Nothing

Disclaimer: Ik weet niet hoe de file noch de database eruit ziet, en dit is uit de losse pols, dus er zouden wat foutjes in kunnen zitten.

Het voordeel van de bovenstaande code is dat de file maar 1 keer doorlopen wordt, en dat er geen recordsets worden opgebouwd, maar alleen direkte INSERT of UPDATE queries worden gedraaid voor de relevante regels. Dat zou wat snelheidswinst moeten opleveren.

Enjoy :)

Edit: Terwijl ik dit post, zie ik dat je een linkje hebt gegeven naar een voorbeeldfile, en ik snap nu eigenlijk niet wat je precies wil met de '098' regels. Zoals het nu is gaat het niet werken in ieder geval.

[ Voor 20% gewijzigd door Verwijderd op 28-03-2004 05:42 ]


  • Dutch_guy
  • Registratie: September 2001
  • Laatst online: 20-04 14:47
Zo werkt het inderdaad niet. Maar evengoed bedankt. :)

Ieder 001 regel heeft een 098 regel voorafgaand. Beide regels wil ik als 1 record in de database opslaan. Dat werkt nu ook, echter ik voer nu alles dubbel uit en koppel de 098 regel daarna met de 001 middels een uniek nummer wat beide regels bevat.

Echter het moet dus sneller kunnen.

Pay peanuts get monkeys !


Verwijderd

Uhm ... het wordt een beetje vaag zo. Ik weet ongeveer wat je wil, dus zal je ook ongeveer een idee geven.

Als je weet dat elke 098 regel wordt gevolgd door een 001 regel, waarom lees je niet per die 2 regels in, en verwekr ze in 1 keer? Mijn code zou een aardige start moeten geven, maar dan met 1 INSERT statement, waarbij je de gegevens uit beide regels tegelijk verwerkt, ipv eerst een INSERT en daarna een UPDATE statement.

Met een klein beetje denkwerk kom je er dan wel uit.

Succes :)
Pagina: 1