webForumDet fria alternativet

Läsa in semikolonseparerad textfil

ASP

12 svar · 1 281 visningar · startad av devotion

Medlem sedan jan. 20013 582 inlägg
Frågan#1

Hej på er!

Sökte lite i forumet för att hitta nått som kan läsa in en textfil...

Hittade då denna:
http://www.webforum.nu/showthread.php?p=1246578#post1246578
:e

Nu har jag en annan textfil som jag vill läsa in, som är semikolonseparerad.

Kan man läsa in en sådan fil på likande sätt?

Filen har en H-del (orderhuvud) och en L-del (orderrader)

Och ser ut så här:

H;;;6;;;102805;;;;;;;;;;;;;;;;;2008-10-01;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Finn Rasmussen;;;;;;;;;;;;2;;;;;;;;;;;-1
L;1;13SYS05700D02;;12;24;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;2008-09-30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1

Mvh
Henrik

Medlem sedan juni 20019 519 inlägg
#2

Är det samma "data" per rad, eller kan det innehålla någon annan data (menar att varje ; kan ha en text framför sig:

H;Test;produkt;mm....

Eller är det bara dessa data du är intresserad av?

Jag hade kanske gjort en RegExp replace på ";+" => ";" och sedan bara köra en vanlig Split(newValue,";") för att få ut arrayn på det sättet.

Medlem sedan jan. 20013 582 inlägg
#3

Hej! :)

Jag tror inte regexp behövs i detta fallet... :)

Jag har gjort så här:

Sub main()
	dim o, f, line
	dim q, i
	dim lOrderId
	
	set o = createObject("scripting.filesystemobject")
	set f = o.openTextfile("\\lin-dc\ClientApps\UppdragNU\Tools\order.txt", 1)

	do while not f.atendofstream
		line = f.readline
		
		If left(line, 1) = "H" then

			q = split(line,";")
			
			for i = lbound(q) to ubound(q)
			next
			lOrderId=CreateOrder("System", Now(), q(1), "Adm", q(6), q(23))
		Elseif left(line, 1) = "L" then
			q = split(line,";")
			
			for i = lbound(q) to ubound(q)
			next
			Call CreateOrderRows(lOrderId, q(2), q(4), q(5))
		End if
	loop
	
	set o = nothing
	set f = nothing
	
	Call refresh()
End Sub

Textfilen är uppbyggd på detta sättet:

H;1000;;6;;;102805;;;;;;;;;;;;;;;;2008-10-06;2008-10-01;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Finn Rasmussen;;;;;;;;;;;;2;;;;;;;;;;;-1
L;1;13SYS05700D02;;12;24;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;2008-09-30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1
L;2;23DOT06000G20;;4;113;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;2008-09-30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1
L;3;23DOT06000G46;;4;113;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;2008-09-30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1
L;4;05GRA14300D90;;6;79;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;2008-09-30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1
L;5;05GRA14300H01;;6;79;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;2008-09-30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1
H;1000;;6;;;100052;;;;;;;;;;;;;;;;2008-10-06;2008-10-01;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Finn Rasmussen;;;;;;;;;;;;2;;;;;;;;;;;-1
L;6;27KUD04600N05;;4;42;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;2008-09-30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1
L;7;27KUD05000N05;;12;42;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;2008-09-30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1
L;8;27KUD06000N05;;8;64;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;2008-09-30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1
L;9;21MAN54000B40;;12;69;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;2008-09-30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1
L;10;21PEP54000G29;;12;69;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;2008-09-30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1
L;11;21PEP54000G06;;12;69;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;2008-09-30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1
L;12;23SET05000G19;;4;82;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;2008-09-30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1
L;13;23SID05000G15;;4;82;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;2008-09-30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1
L;14;23SID05000H01;;4;82;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;2008-09-30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1
L;15;23SPR04600G20;;4;99;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;2008-09-30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1
H;1000;;6;;;100030;;;;;;;;;;;;;;;;2008-10-06;2008-10-01;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Finn Rasmussen;;;;;;;;;;;;2;;;;;;;;;;;-1
L;16;13SYS05700H01;;12;24;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;2008-09-30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1
L;17;06ORI03600D90;;12;23;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;2008-09-30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1
L;18;06ORI03600H01;;12;23;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;2008-09-30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1
L;19;05ORI14800D90;;6;89;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;2008-09-30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1
L;20;05ORI14800H01;;6;89;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;2008-09-30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1
L;21;17BAS23702G16;;2;360;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;2008-09-30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1
L;22;17BAS23702C57;;2;360;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;2008-09-30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1
L;23;17TWI23702N01;;2;340;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;2008-09-30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1

Allt verkar fungera, ovanstående kod ger tre ordrar med rätt orderrader....

Något jag behöver tänka på, eller ser allt bra ut?

Mvh
Henrik

Medlem sedan jan. 20013 582 inlägg
#4

Har gjort om koden lite

Sub main()
	dim Conn, sSQL
	dim o, f, line
	dim q, i
	dim lOrderId, lOrderArtId
	
	'Öppna databasen
	Set Conn=CreateObject("ADODB.Connection")
	Conn.Open Application.sDbConnectionString
	
	set o = createObject("scripting.filesystemobject")
	set f = o.openTextfile("\\lin-dc\ClientApps\UppdragNU\Tools\order.txt", 1)

	do while not f.atendofstream
		line = f.readline
		
		If left(line, 1) = "H" then

			q = split(line,";")
			
			for i = lbound(q) to ubound(q)
			next
		
			lOrderId=GetNextId("tblOrder")

			sSQL ="INSERT INTO [tblOrder]" _
				& "([Id], [Modified], [Status], [CreatedBy], [CreatedDate], [Nr], [UserSign], [CustomerNr], [OrderDate])" _
				& "VALUES (" & lOrderId & ",GetDate(), 2,'System',GetDate(),'" & q(1) & "','Adm','" & q(6) & "','" & q(23) & "')"
				Conn.Execute sSQL,,128
				
		Elseif left(line, 1) = "L" then
			q = split(line,";")
			
			for i = lbound(q) to ubound(q)
			next

			lOrderArtId=GetNextId("tblOrdArt")
	
			sSQL ="INSERT INTO [tblOrdArt]" _
				& "([Id], [Modified], [OrderId], [ArtNr], [Amount], [Price], [Unit])" _
				& "VALUES (" & lOrderArtId & ",GetDate()," & lOrderId & ",'" & q(2) & "','" & q(4) & "','" & q(5) & "','st')"
				Conn.Execute sSQL,,128
		End if
	loop
	
	set o = nothing
	set f = nothing
	
	Conn.Close
	Set Conn=Nothing
	
	Call refresh()
End Sub

Hur hanterar man på bästa sätt uppdateringar. Dvs om en order redan finns så skall uppgifterna i orderhuvudet uppdateras, raderna skall uppdateras, läggas till eller tas bort...

Mvh
Henrik

Medlem sedan dec. 20025 483 inlägg
#5

De dubbla förekomsterna av

 			for i = lbound(q) to ubound(q)
			next

...kan du ta bort. De gör ingen nytta.

Medlem sedan jan. 20013 582 inlägg
#6

Peter S skrev:

De dubbla förekomsterna av

 			for i = lbound(q) to ubound(q)
			next

...kan du ta bort. De gör ingen nytta.

Hmmm, hur menar du nu? :)

Varför behövs inte de? den ena är ju om raden börjar med H, den andra om raden börjar med L... :)

Medlem sedan dec. 20025 483 inlägg
#7

Nej, inte i det här fallet, eftersom du inte gör någonting i loopen:

for...
  ' här gör du inget!
next
Medlem sedan jan. 20013 582 inlägg
#8

aha! :)

Medlem sedan jan. 20013 582 inlägg
#9

eller, nähä....

Jag fattar inte... :(

Medlem sedan dec. 20025 483 inlägg
#10

Om jag ställer följande frågor då: Varför menar du att looparna behöver vara kvar? Vad för arbete görs i dem?

Medlem sedan jan. 20013 582 inlägg
#11

inget... :)

Medlem sedan dec. 20025 483 inlägg
#12

Aha! :D

Medlem sedan jan. 20013 582 inlägg
#13

Hej igen! :)

Så här då:

'****************************************
Option explicit
'****************************************
Sub main()
	dim Conn, sSQL
	dim o, f, line
	dim q, i
	dim lOrderId, lOrderArtId
	
	'Öppna databasen
	Set Conn=CreateObject("ADODB.Connection")
	Conn.Open Application.sDbConnectionString
	
	set o = createObject("scripting.filesystemobject")
	set f = o.openTextfile("\\lin-dc\ClientApps\UppdragNU\Tools\order.txt", 1)

	do while not f.atendofstream
		line = f.readline
		
		If left(line, 1) = "H" then
			q = split(line,";")
					
			lOrderId=GetNextId("tblOrder")

			sSQL ="INSERT INTO [tblOrder]" _
				& "([Id], [Modified], [Status], [CreatedBy], [CreatedDate], [Nr], [UserSign], [CustomerNr], [OrderDate])" _
				& "VALUES (" & lOrderId & ",GetDate(), 2,'System',GetDate(),'" & q(1) & "','Adm','" & q(6) & "','" & q(23) & "')"
				Conn.Execute sSQL,,128
				
		Elseif left(line, 1) = "L" then
			q = split(line,";")

			
			lOrderArtId=GetNextId("tblOrdArt")
	
			sSQL ="INSERT INTO [tblOrdArt]" _
				& "([Id], [Modified], [OrderId], [ArtNr], [Amount], [Price], [Unit])" _
				& "VALUES (" & lOrderArtId & ",GetDate()," & lOrderId & ",'" & q(2) & "','" & q(4) & "','" & q(5) & "','st')"
				Conn.Execute sSQL,,128
		End if
	loop
	
	set o = nothing
	set f = nothing
	
	Conn.Close
	Set Conn=Nothing
	
	Call refresh()
End Sub

Hur gör man bäst (med tanke på prestanda mm) för att kolla om en order redan finns och isåfall göra en update, annars insert?

mvh
Henrik

267 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)