webForumDet fria alternativet

Skriva ut sista raden ur en textfil?

ASP

17 svar · 382 visningar · startad av ConnyFox

Medlem sedan aug. 20011 087 inlägg
Frågan#1

Som rubriken säger, hur skriver man ut sista raden ur en textfil?

Och hur skriver man ut näst sista osv?

någon som vet?

tack på förhand!

Medlem sedan juni 200032 967 inlägg
#2

Tja, det borde väl gå. Skrivet ur skallen, otestat alltså:

<%
set objFSO = Server.CreateObject("Scripting.FileSystemObject")
set objFile = objFSO.OpenTextFile(Server.MapPath("Filen.txt"))
strFile = objFile.Readall
objFile.Close
set objFile = Nothing
set objFSO = Nothing
arrFile = split(strFile, vbCrLf)
Response.write arrFile (ubound(arrFile)) ' sista raden
Response.write arrFile (ubound(arrFile)-1) ' näst sista raden
%>

Det är dock en bra idé att kontrollera att filen har tillräckligt många rader först, innan du försöker skriva ut dem.

Mvh

Medlem sedan jan. 20032 285 inlägg
#3
<%
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTS = objFSO.OpenTextFile(Server.MapPath("textfilen.txt"),1)

arrRows = Split(objTS.ReadAll,vbCrLf)
Response.Write(arrRows(UBound(arrRows)))

objTS.Close
Set objTS = Nothing
Set objFSO = Nothing
%>

Skriver ut sista raden.

/red Måste vara snabbare! ;)

Medlem sedan aug. 20011 087 inlägg
#4

tack för hjälpen men tyvärr så funkar det endast på sista raden och inte näst sista =(

Medlem sedan juni 200032 967 inlägg
#5

Hur har du skrivit? Vad innehåller textfilen? Vad får du för felmeddelande?

Medlem sedan jan. 20032 285 inlägg
#6
<%
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTS = objFSO.OpenTextFile(Server.MapPath("textfilen.txt"),1)

arrRows = Split(objTS.ReadAll,vbCrLf)
Response.Write(arrRows(UBound(arrRows))) ' Sista raden
Response.Write(arrRows(UBound(arrRows) - 1)) ' Näst sista
Response.Write(arrRows(UBound(arrRows) - 2)) ' Näst näst sista

objTS.Close
Set objTS = Nothing
Set objFSO = Nothing
%>

O.s.v...

Medlem sedan aug. 20011 087 inlägg
#7

tack det funkar ungefär som jag ville ;)

Lite skumt dock
Response.Write(arrRows(UBound(arrRows))) ' Sista raden
Response.Write(arrRows(UBound(arrRows) - 1)) ' Näst sista
Response.Write(arrRows(UBound(arrRows) - 2)) ' Näst näst sista

skriver endast ut
Response.Write(arrRows(UBound(arrRows))) ' Sista raden
Response.Write(arrRows(UBound(arrRows) - 1)) ' Näst sista

likadant om man väljer fler att alla utan 1 skrivs ut hehe men d e ju inget problem direkt, bara o lägga till en extra.

Tack för hjälpen!

Medlem sedan jan. 20032 285 inlägg
#8

Annars kan du göra de lite enklare:

<%
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTS = objFSO.OpenTextFile(Server.MapPath("textfilen.txt"),1)

arrRows = Split(objTS.ReadAll,vbCrLf)
For i = UBound(arrRows) To (UBound(arrRows) - så många från botten du vill visa) Step -1
  Response.Write(arrRows(i))
Next

objTS.Close
Set objTS = Nothing
Set objFSO = Nothing
%>
Medlem sedan aug. 20011 087 inlägg
#9

Ok tack funkar perfa!

Nu när jag ändå e här kan jag ju passa på o fråga.

Raderna som skrivs ut innehåller ett flertal olika värden (på en o samma rad alltså)

ex.
2003/03/23 10:04.42 784. Misfits - Witch Hunt (1:31)

går det på något smidigt vis splitta upp även raderna så att datum/tid, låt nr, låt titel skrivs ut separat?

Och går det att med sebbes kod skriva ut alla utan just den senaste?

Tack på förhand, e inte så haj på FSO som ni kanske fattar, precis börjat.

Medlem sedan jan. 20032 285 inlägg
#10

Svaret på den sista frågan, angående alla utan den senaste:

<%
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTS = objFSO.OpenTextFile(Server.MapPath("textfilen.txt"),1)

arrRows = Split(objTS.ReadAll,vbCrLf)
For i = UBound(arrRows) To (LBound(arrRows) + 1) Step -1
  Response.Write(arrRows(i))
Next

objTS.Close
Set objTS = Nothing
Set objFSO = Nothing
%>

Men det där med att splita datum/tid, m.m. kan bli svårt, eftersom det inte finns något som visar var det slutar... Det hade varit lättare om det fanns någon avgränsare mellan varje "avdelning". T.ex: 2003/03/23 10:04.42 | 784. | Misfits - Witch Hunt | (1:31)

Medlem sedan aug. 20011 087 inlägg
#11

Tackar!

Ajda.. Nee d gör ju inte d =/ borde man inte kunna utgå från att det som ligger före andra mellanslaget är en sak, det som ligger mellan andra och tredje är en sak, det som ligger mellan tredje mellanslaget och första parantestecknet är en.. och sedan på nått vis klura fram så att parantesen är en? eller d kanske inte funkar?

Medlem sedan aug. 20011 087 inlägg
#12

Och finns det någon bra (helst svensk) guide som redogör för alla delar och funktioner i fso?

Medlem sedan mars 20015 287 inlägg
#13
<%
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTS = objFSO.OpenTextFile(Server.MapPath("textfilen.txt"),1)

arrRows = Split(objTS.ReadAll,vbCrLf)
For i = UBound(arrRows)-1 To (UBound(arrRows)-4) Step -1
  Response.Write "Datum: " & splitstr(arrRows(i))(0) & "<br>"
  Response.Write "Artist: " & splitstr(arrRows(i))(3) & "<br>"
  Response.Write (arrRows(i)) & "<br>"
Next

objTS.Close
Set objTS = Nothing
Set objFSO = Nothing

Function splitstr(rad)
arrRad = Split(rad," ")
splitstr = arrRad 
End Function
%>

Problemen kan börja uppstå om mönstret inte alltid stämmer, tex om gruppnamnet består av flera ord, likaså låttiteln. Som du själv säger kanske man ska ge sig in på o kika var parentesen sitter i så fall.

Länkar:
Inte på svenska, men en del säger det väl:
http://www.devguru.com/Technologies/vbscript/quickref/textstream.html
http://www.sloppycode.net/fso/?p=d

Medlem sedan aug. 20011 087 inlägg
#14

funkar bra på datum tid och låtnummer, dessa splittas upp bra.
Men som sagt eftersom många låtnamn innehåller flera ord så blire skumt.

Men om vi struntar i låtens varakrighet och jag vill skriva ut allt efter låtnummret hur gör jag då detta?

<%
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTS = objFSO.OpenTextFile(Server.MapPath("yawn.log"),1)

arrRows = Split(objTS.ReadAll,vbCrLf)
For i = UBound(arrRows)-1 To (UBound(arrRows)-4) Step -1
  Response.Write "Datum: " & splitstr(arrRows(i))(0) & "<br>"
  Response.Write "Tid: " & splitstr(arrRows(i))(1) & "<br>"
    Response.Write "Låtnummer: " & splitstr(arrRows(i))(4) & "<br>"
	    Response.Write "Låtnummer: " & splitstr(arrRows(i))(5) & "<br>"
  Response.Write (arrRows(i)) & "<br>"
Next

objTS.Close
Set objTS = Nothing
Set objFSO = Nothing

Function splitstr(rad)
arrRad = Split(rad," ")
splitstr = arrRad 
End Function
%>
Medlem sedan mars 20015 287 inlägg
#15

En riktig fullösning, går säkerligen att göra vackrare.
Vet du att låten/artisten alltid avgränsas med ett bindestreck kan du använda det som avgänsare för att skilja på låt/artist.

<%
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTS = objFSO.OpenTextFile(Server.MapPath("yawn.log"),1)

arrRows = Split(objTS.ReadAll,vbCrLf)
For i = UBound(arrRows)-1 To (UBound(arrRows)-4) Step -1
	Response.Write "Datum: " & splitstr(arrRows(i))(0) & "<br>"
	Response.Write "Tid: " & splitstr(arrRows(i))(1) & "<br>"
	Response.Write "Låtnummer: " & splitstr(arrRows(i))(2) & "<br>"

	songstart = len(splitstr(arrRows(i))(0) & splitstr(arrRows(i))(1) & splitstr(arrRows(i))(2))+3
	songlenght = InStr(arrRows(i),"(") - songstart

	Response.Write "Artist/Låt: " & Mid(arrRows(i),songstart,songlenght) & "<br>"
	
Next

objTS.Close
Set objTS = Nothing
Set objFSO = Nothing

Function splitstr(rad)
arrRad = Split(rad," ")
splitstr = arrRad 
End Function
%>
Medlem sedan aug. 20011 087 inlägg
#16

hmm.. jag modifierade koden lite, nu skriver den ut allt bra men låtlängden skrivs inte ut alls..

<%
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTS = objFSO.OpenTextFile(Server.MapPath("yawn.log"),1)

arrRows = Split(objTS.ReadAll,vbCrLf)
For i = UBound(arrRows)-1 To (UBound(arrRows)-15) Step -1
	Response.Write "Datum: " & splitstr(arrRows(i))(0) & "<br>"
	Response.Write "Tid: " & splitstr(arrRows(i))(1) & "<br>"
	Response.Write "Låtnummer: " & splitstr(arrRows(i))(4) & "<br>"

	songstart = len(splitstr(arrRows(i))(0) & splitstr(arrRows(i))(1) & splitstr(arrRows(i))(4))+5
	songlenght = InStr(arrRows(i),"(") - songstart

	Response.Write "Artist/Låt: " & Mid(arrRows(i),songstart,songlenght) & "<br>"
	
Next

objTS.Close
Set objTS = Nothing
Set objFSO = Nothing

Function splitstr(rad)
arrRad = Split(rad," ")
splitstr = arrRad 
End Function
%>
Medlem sedan mars 20015 287 inlägg
#17

Namngivningen avvariablerna är ju inte den fyndigaste kanske.

<%
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTS = objFSO.OpenTextFile(Server.MapPath("yawn.log"),1)

arrRows = Split(objTS.ReadAll,vbCrLf)
For i = UBound(arrRows)-1 To (UBound(arrRows)-15) Step -1
	Response.Write "Datum: " & splitstr(arrRows(i))(0) & "<br>"
	Response.Write "Tid: " & splitstr(arrRows(i))(1) & "<br>"
	Response.Write "Låtnummer: " & splitstr(arrRows(i))(4) & "<br>"

	titlestart = len(splitstr(arrRows(i))(0) & splitstr(arrRows(i))(1) & splitstr(arrRows(i))(4))+5
	titlestopp = InStr(arrRows(i),"(")
	titlelength = titlestopp - titlestart 

	Response.Write "Artist/Låt: " & Mid(arrRows(i),titlestart,titlelength) & "<br>"

	songlenght = InStr(arrRows(i),")")

	Response.Write "Låtlängd: " & Mid(arrRows(i),titlestopp,songlenght) & "<br>"
Next

objTS.Close
Set objTS = Nothing
Set objFSO = Nothing

Function splitstr(rad)
arrRad = Split(rad," ")
splitstr = arrRad 
End Function
%>
Medlem sedan aug. 20011 087 inlägg
#18

Tack nu funkar det perfa! *gör tummen upp*

262 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)