Scenario: Så här långt har jag kommit... Har du tusen rader i "log_sent.txt" och sen ska du gå igenom "log_revied.txt" för varje rad så har du många rader som ska gå igenom. I optimalt fall så innehåller varje fil 336 rader. Vad har du som skapar loggfilerna? Är det ett externt program som skapar dessa eller ligger det i din ASP-kod? Jag hade nog gjort ungefär så här: (otestat) Jag hade nog gjort ungefär så här: (otestat)hjälp med att loopia igenom 2 textfiler.
Varje timma skickar jag två mail, ett till varje e-postadress.
I samband med att mailet skickas så skapas en logfil, log_sent.txt
När mailet tas emot så genereras en motsvarande logfil, log_revied.txt
Lograderna är formaterade så här:
åååå-mm-dd hh:mm:ss;epostadress;ticket (ticket är 25 tecken lång)
Nu behöver jag göra följande:
1) Läsa in log_sent.txt
2) Läsa in log_recived.txt
3) Välja första raden i log_sent.txt
4) Leta efter raden i log_recived.txt där tickten motsvarar den i log_sent
5) Om den hittas så ska det skrivas till en ny logfil, log_status.txt, något i stil med "ok." (vad som ska skrivas kan jag lura ut senare...)
6) Om den inte hittas så ska den fortsätta till nästa rad i log_sent och börja om, samt skriva "ej ok" (typ) i log_status.txt.
Vad jag behöver hjälp med är hur man gör själva loopandet mellan filerna... punkt 5 och 6...Sv: hjälp med att loopia igenom 2 textfiler.
Det är i loopen, en bit ner i koden, som jag fastnar...
'Skapar objekt för skickat-loggen
logFileRecived = "log_recived.txt"
logFileSent = "log_sent.txt"
Set fileSentObject=Server.CreateObject("Scripting.FileSystemObject")
Set sentFile=fileSentObject.OpenTextFile(Server.MapPath(logFileSent), 1)
'Skapar objekt för mottaget-loggen
Set receivedFileObject=Server.CreateObject("Scripting.FileSystemObject")
Set receivedFile=receivedFileObject.OpenTextFile(Server.MapPath(logFileRecived), 1)
'Loopa igenom båda filerna
do while sentFile.AtEndOfStream = false and receivedFile.AtEndOfStream = false
'skapar upp arrayerna
sentArray = Split(sentFile.readline, ";")
receivedArray = Split(receivedFile.readline, ";")
'arrayer...
sentArray(0) ' datum och tid skickat
receivedArray(0) ' datum och tid mottaget
sentArray(1) ' epostadress skickat
receivedArray(1) 'epostadress mottaget
sentArray(2) 'ticket skickat
receivedArray(2) 'ticket mottaget
loop
'Stänger och nollar objekten
sentFile.Close
receivedFile.Close
Set sentFile=Nothing
Set fileSentObject=Nothing
Set receivedFile=Nothing
Set receivedFileObject=Nothing
Sv: hjälp med att loopia igenom 2 textfiler.
Ligger dessa kvar i filerna och du läser in raderna i varje loopsteg för att genomföra kollen så skulle inte jag vilja ligga på samma webserver med mina sidor. Beroende på filernas storlek så skulle man kunna lagra "log_revied.txt" i en textsträng (finns begränsningar på antalet tecken) och med hjälp av "inStr" kan jag snabbt se om raderna i "log_sent.txt" finns med i "log_revied.txt". Genom att kolla om rad1 finns med så kollar man:
if InStr(log_revied,checkRow) > -1 then 'Raden finns med...
Annat alternativ är att du lagrar alla rader i "log_revied.txt" i en array och tar fram rad för rad i "log_sent.txt" och då går igenom arrayen istället. Samma sak här som jag funderar på hur många rader filen är på om det går att lagra alla i en array.
Men det bästa alternativet i mina ögon är att ha all denna information i en databas istället. Lätt JOIN kan tala om för dig antalet som har en koppling, utan att göra en 3:e fil. Lätt SQL-sats så kan man ta fram alla "ticket" för en specifik period. Du kan ta fram alla på en specifik epost-adress m.m. Du kan som sagt var plocka fram enkel statistik genom att ändra en SQL-sats.
Hur många gånger kommer du att läsa och gå igenom dessa filer? Växer filerna konstant eller går man in och raderar dessa på alla som blivit markerad "ok" med jämna mellanrum?Sv:hjälp med att loopia igenom 2 textfiler.
logfilerna återställs varje vecka, så dom kommer aldrig att vara större än så.
Att använda sig av databas tror jag inte är optimalt. även om det hade gjort saker och ting betydligt enklare vid själva urvalet.
Om jag ska använda mig av en databas måste jag skriva en rutin för att importera log-filerna i databasen per automatik... men det kanske inte är så svårt?
Logfilerna kommer att gås igenom en gång / vecka.
Varje timma fylls log_sent.txt på med 2 rader kod, och i optimala fall så fylls log_recived.txt på med samma info.
Varje söndag så ska dessa sammanföras och generera en "total-logg" (ny log-fil varje vecka.)Sv: hjälp med att loopia igenom 2 textfiler.
Om dom inte är större än de antalet rader så bör det inte vara några problem att spara ner filerna i en array. Enklast är att läsa in filerna och sen lägga till något, t.ex. #!# mellan raderna. Kör sedan SPLIT på #!# och du har dessa i en array.
For i = 0 to Ubound(searchArray)
For y = 0 to Ubound(foundArray)
if searchArray(i) = foundArray(y) then
'Save in new file
Exit For
end if
Next
Next
Om allt ligger i ordning så skulle man kunna lägga in detta för att slippa läsa införsta raderna hela tiden (byt ut koden innanför första FOR-satsen...):
For y = startSearchIndex to Ubound(foundArray)
if searchArray(i) = foundArray(y) then
'Save in new file
startSearchIndex = y
Exit For
end if
Du borde även lätt kunna köra log_sent.txt till en array och och "log_recived.txt" i en lång string och då använda dig utav inStr.
For i = 0 to Ubound(searchArray)
if InStr(searchArray(i), logRecived) > -1 then
'Save in new file
end if
Next
Kan hända att du får switcha på "searchArray(i)" och "logRecived".Sv: hjälp med att loopia igenom 2 textfiler.
<code>
Set sent = CreateObject("Scripting.Dictionary")
Do While Not sentFile.AtEndOfStream
splitsent = Split(sentFile.ReadLine,";")
sent.Add splitsent(2), Nothing
Loop
Do While Not receivedFile.AtEndOfStream
splitrcv = Split(receivedFile.ReadLine,";")
if sent.Exists(splitrcv(2))
statusfile.Write "ok"
Else
statusfile.Write "ej ok"
End If
Loop
</code>Sv: hjälp med att loopia igenom 2 textfiler.
<code>
Set sent = CreateObject("Scripting.Dictionary")
Do While Not sentFile.AtEndOfStream
splitsent = Split(sentFile.ReadLine,";")
sent.Add splitsent(2), Nothing
Loop
Do While Not receivedFile.AtEndOfStream
splitrcv = Split(receivedFile.ReadLine,";")
if sent.Exists(splitrcv(2))
statusfile.Write "ok"
Else
statusfile.Write "ej ok"
End If
Loop
</code>