webForumDet fria alternativet

Inte räkna alla tecken

ASP

11 svar · 385 visningar · startad av ampy

Medlem sedan feb. 20011 498 inlägg
Frågan#1

Har denna kod för att räkna ut antal tecken per post i genomsnitt:

<%
Set uRS = Connect.Execute("select avg(len(meddelande)) as averageLength from forum where skribent = '"&username&"'") 
Response.Write Round(uRS("averageLength"),1)
	
End If
RS.Close

%>

Men nu undrar jag hur man gör så att man INTE räknar de tecken som finns mellan [ CITAT ] och [ /CITAT ] och den ska inte heller räknar orden [ CITAT ] och [ /CITAT ]

Går detta att göra och isf hur?

Medlem sedan dec. 200012 464 inlägg
#2

Om det finns någon replace-funktion i Access så skulle det väl gå. Jag förstår dock inte varför du skall krångla till det i onödan.

Medlem sedan feb. 20011 498 inlägg
#3

Vadå krångla till det?

Medlem sedan dec. 200012 464 inlägg
#4

Det var för att jag läste din post innan redigeringen.

I så fall så måste du plocka upp varje meddelande för sig och använda regexp för att ta bort det som står mellan citat coh sedan räkna ut genomsnittet. Det går men det blir lite kodande.

Jag tycker fortfarande att det är onödigt krångel.

Medlem sedan feb. 20011 498 inlägg
#5

Kan du visa hur man gör det?

Medlem sedan dec. 200012 464 inlägg
#6

Ja, det kan jag väl försöka med.

dim connect,rs,query
set connect = server.createobject("adodb.connection")
connect.open "dsn"
query = "select meddelande from forum where skribent = '"&username&"'") 

set rs = connect.execute(query)
length = 0
items = 0
if not rs.eof then

set re = new regexp
re.ignorecase = true
re.global = true
re.pattern = "(\[CITAT\].*?\[/CITAT\])"
while not rs.eof
  length = length + len(re.replace(rs("meddelande"),""))
  items = items + 1
  rs.movenext
wend
avglength = round(cdbl(length)/cdbl(items),2)
else
avglength = 0
end if
Medlem sedan feb. 20011 498 inlägg
#7

Din kod fungerar utmärkt :birp

Fast jag vill också så att denna kod räknar som den innan men jag fattar inte hur jag ska lägga till det, kan du visa?

<%
query2 = "select top 10 skribent,avg(len(meddelande)) as averageLength " & _
" from forum inner join affar on forum.skribent_id = affar.medlemsid " &_
" where tecken = 'ja' " & _
" group by skribent order by 2 desc"

set rs = connect.execute(query2)
c = 0
if  not rs.eof then
response.write "De 10 som har mest tecken per inlägg: <br>"
do while not rs.eof
c = c + 1
response.write "<b><font color='#BE0202'>" & c  & ".</font></b> " & rs("skribent") & " <font color='#676767'>(" & round(rs("averageLength"),2) & " tecken" & ")</font><br>"
       
if c = 10 then exit do
rs.movenext
loop
end if
%>
Medlem sedan dec. 200012 464 inlägg
#8

Det är nu som det börjar krångla till sig ordentligt.

Du får beräkna medel för alla användare, lagra detta i en array och sortera den och sedan skriva ut de 10 första

ungefär

dim avg(1,100)
query = "select skribent,meddelande from forum order by skribent"
set rs = connect.execute(query)
s = ""
users = -1
while not rs.eof
   if  s <> rs("skribent") then
       s = rs("skribent")
       if  users >= 0 then
           if  users > ubound(avg) then redim preserve avg(users+100)
           avg(0,users) = s
           avg(1,users) = avglen
       end if
       avglen = 0
       items = 0
       users = users + 1
  end if
'beräkna längd enligt tidigare
   rs.movenext
wend
'sortera array fallande
for i = 0 to 9
response.write avg(0,i) & " " & avg(1,i)
next

Ovanstående är inget som är testat överhuvudtaget, men är mer tänkt som en skiss

Medlem sedan feb. 20011 498 inlägg
#9

Testade din kod nu och får då följande fel:

Felaktigt matrisindex

på denna rad:

if users > ubound(avg) then redim preserve avg(users+100)

Medlem sedan dec. 200012 464 inlägg
#10
if  users > ubound(avg,2) then redim preserve avg(1,users+100)

Vad var det jag sa?

Medlem sedan feb. 20011 498 inlägg
#11

Fattar inte vad jag ska sätta ihop koderna. Kan du inte visa mig LarsG, vore väldigt snällt?

<%
query2 = "select top 10 skribent,avg(len(meddelande)) as averageLength " & _
" from forum inner join affar on forum.skribent_id = affar.medlemsid " &_
" where tecken = 'ja' " & _
" group by skribent order by 2 desc"

set rs = connect.execute(query2)
c = 0
if  not rs.eof then
response.write "De 10 som har mest tecken per inlägg: <br>"
do while not rs.eof
c = c + 1
response.write "<b><font color='#BE0202'>" & c  & ".</font></b> " & rs("skribent") & " <font color='#676767'>(" & round(rs("averageLength"),2) & " tecken" & ")</font><br>"
       
if c = 10 then exit do
rs.movenext
loop
end if

KOD 2 --------------------------------------------------

dim avg(1,100)
query = "select skribent,meddelande from forum order by skribent"
set rs = connect.execute(query)
s = ""
users = -1
while not rs.eof
   if  s <> rs("skribent") then
       s = rs("skribent")
       if  users >= 0 then
          if  users > ubound(avg,2) then redim preserve avg(1,users+100)
           avg(0,users) = s
           avg(1,users) = avglen
       end if
       avglen = 0
       items = 0
       users = users + 1
  end if
'beräkna längd enligt tidigare
   rs.movenext
wend
'sortera array fallande
for i = 0 to 9
response.write avg(0,i) & " " & avg(1,i)
next

%>
Medlem sedan dec. 200012 464 inlägg
#12
set re = new regexp
re.ignorecase = true
re.global = true
re.pattern = "(\[CITAT\].*?\[/CITAT\])"
avglength = round(cdbl(length)/cdbl(items),2)

dim avg(1,100)
query = "select skribent,meddelande from forum order by skribent"
set rs = connect.execute(query)
s = ""
users = -1
while not rs.eof
   if  s <> rs("skribent") then
       s = rs("skribent")
       if  users >= 0 then
          if  users > ubound(avg,2) then redim preserve avg(1,users+100)
           avg(0,users) = s
           avglen = round(cdbl(length)/cdbl(items),2)
           avg(1,users) = avglen
       end if
       length = 0
       items = 0
       users = users + 1
  end if
  length = length + len(re.replace(rs("meddelande"),""))
  items = items + 1
  rs.movenext
wend
'sortera array fallande
for i = 0 to 9
response.write avg(0,i) & " " & avg(1,i)
next

Det finns nog lite exempel på hur man kan sortera en array i tidigare inlägg. Du kan ju vänta med den och se till att beräkningen av medelvärdet fungerar ordentligt först.

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