Gör en yttre loop som loopar över raderna, samt en inre loop som du hoppar in i så fort du stöter på en rad som börjar på "1". I den inre loopen ackumulerar du de databasfrågor som ska köras för artikeln och när du sen stöter på nästa "1"-rad så exekverar du den ackumulerade uppdateringen och tömmer den, inför nästa looprunda.
Nu har visserligen emission givit ett svar, men eftersom jag påbörjade ett ihopskriveri innan det kom till kännedom, postar jag någonting du kanske kan utgå från
set o = createobject("scripting.filesystemobject")
set f = o.opentextfile("foo.text", 1)
f.skipline 'ej intresserad av den första raden
set r = new regexp
r.pattern = "^\d(\d{8})([^\s]{25})(\d{8})"
set m = r.execute(f.readline)
if not (m.count > 0) then
response.write "Fel på regex!"
response.end
end if
tenr = m(0).submatches(0) 'e-nummer
tterm = m(1).submatches(0) 'benämning
tdate = m(2).submatches(0) 'prisändr.datum
r.pattern = "^(\d)(\d{2})(\d{8})([\+- \?])([^\s]+)"
do while not f.atendofstream
set m = r.execute(f.readline)
if not (m.count > 0) then exit do
'm(0).submatches(0) -> grossistkod
'm(1).submatches(0) -> grossistpris
'm(2).submatches(0) -> status
'm(3).submatches(0) -> rabattkod
loop
set r = nothing
f.close
Den första regexp:en hämtar ut de olika delarna på rad #2, enligt specen. Dessa placeras sedan i t-variablerna (bra namn, eller hur? Eller vänta nu...). Regexp #2 appliceras därefter på varje återstående rad till dess att den fallerar på den sista raden i filen.
I det här fallet ser det inte ut att behövas en inre loop.
set o = createobject("scripting.filesystemobject")
set f = o.opentextfile("foo.text", 1)
f.skipline 'ej intresserad av den första raden
dim tenr, tterm, tdate
do while not f.atendofstream
line = f.readline
if left(line, 1) = "1" then
r.pattern = "^\d(\d{8})([^\s]{25})(\d{8})"
set m = r.execute(line)
tenr = m(0).submatches(0) 'e-nummer
tterm = m(1).submatches(0) 'benämning
tdate = m(2).submatches(0) 'prisändr.datum
elseif left(line, 1) = "2"
r.pattern = "^\d(\d{2})(\d{8})([\+- \?])([^\s]+)"
set m = r.execute(f.readline)
'm(0).submatches(0) -> grossistkod
'm(1).submatches(0) -> grossistpris
'm(2).submatches(0) -> status
'm(3).submatches(0) -> rabattkod
end if
loop
set r = nothing
f.close
Jag tycker dock fortfarande att det saknas något... I den första regexpen ska det ju skrivas till tblArticle.. I den andra till tblPrice.. men, då måste jag ju få med en koppling till artikeln i tblArtcle, dvs jag måste få med enummer även till den andra skrivningen dvs till tblPrice...
dim tenr, tterm, tdate
do while not f.atendofstream
line = f.readline
if left(line, 1) = "1" then
r.pattern = "^\d(\d{8})([^\s]{25})(\d{8})"
set m = r.execute(line)
tenr = m(0).submatches(0) 'e-nummer
tterm = m(1).submatches(0) 'benämning
tdate = m(2).submatches(0) 'prisändr.datum
conn.execute "insert into foo values ("& tenr &", "& tterm &", "& tdate &")",,128
elseif left(line, 1) = "2"
r.pattern = "^\d(\d{2})(\d{8})([\+- \?])([^\s]+)"
set m = r.execute(f.readline)
'm(0).submatches(0) -> grossistkod
'm(1).submatches(0) -> grossistpris
'm(2).submatches(0) -> status
'm(3).submatches(0) -> rabattkod
conn.execute "insert into bar values([red]"& tenr &"[/red],...)",,128
end if
loop
Lite följdfrågor bara. Varför använder du regexp Peter S och inte bara en "loop-lösning" som emission föreslog.... Hur kan man annars göra? Fördelar och nackdelar?
Jag använder regex eftersom det i detta fall är lämpligt, ty filens format är känt i förväg och ett reguljärt uttryck gör det enkelt att plocka ut de intressanta fälten.
Vad gäller fördelar tycker jag regex är mer lättläst. Vilket alternativ som är mer effektivt låter jag vara osagt -- gör en testcase vettja! :D
Looplösningen låter jag emission själv beskriva.
Upptäckte också något ytterligare fel i ovanstående kod, bl.a. ett uteblivit 'then', men det verker du ju ha upptäckt.