Just nu i M3-nätverket
Jump to content

Textspårning


Axi

Recommended Posts

Hej alla glada!

 

Jag har ett lite hobbyprojekt på gång för ett online text spel som heter Utopia (det är säkert någon här kom känner till det). Kort förklarat så är det ett textbaserat spel där man som spelare styr över en "provins" som är grupperad med 24 andra spelare i ett "Kingdom". Detta Kingdom i sin tur är grupperat med andra Kingdoms på en "island".

Spelet går ut på att man men hjälp av matematiska beräkningar ska hitta den formel som gör att din provins blir mest konkurrenskraftig i förhållande till alla andra i andra Kingdoms, mendans du ska samarbeta inom ditt kingdom för att kunna vinna över andra Kingdoms i Krig. Kingdom/Island brukar betecknas via två nummer (KK:II) där KK är kingdomnumret (random) och II är Island numret. Så om jag är med i kingdom nr 10 på island nummer 12 så är "adressen" till mitt kingdom (10:12). När man krigar mot andra provincer så listas resultatet i en lång lista, och inbakat i denna lista finns informationen:

1) Vem som gjort attacken

2) Vilken typ av attack

3) Resultatet

4) Vem som blev attackerad

 

Nedan för följer ett par exempel på hur det kan se ut. Notera att jag har bytt ut informationen för att göra den generell.

 

aaa= Attacker

(kk:ii) = Adress

vvvvv= Vem som blev anfallen

nnn = Resultatvärdet

 

 

aaaaaaaaa (kk:ii) invaded vvvvvv vvv (kk:ii) and captured nnnn acres of land.

aaaaaa aaa (kk:ii) captured nnnn acres of land from vvvvvvvvv (kk:ii).

aaaaaa aaa (kk:ii) invaded vvvvvvvvv (kk:ii) and killed n,nnn people.

aaaa aaaaaa (kk:ii) killed nnnn people within vv vvvvvvvv (kk:ii).

aaaaaaaaa (kk:ii) attempted to invade vvvvvv vvv (kk:ii), but was repelled.

aaaaaaaaa (kk:ii) attempted an invasion of vvvvvv vvv (kk:ii), but was repelled.

aaaaaaaaa (kk:ii) attacked and pillaged the lands of vvv vvv vvv (kk:ii).

aa aaaaa (kk:ii) recaptured nn acres of land from vvv (kk:ii).

aa aaaaa (kk:ii) ambushed armies from vvvv (kk:ii) and took nnnn acres of land.

aaaaaaaa (kk:ii) attacked and stole from vvvvvvv (kk:ii).

aaaaaaaaa (kk:ii) invaded and stole from vv vvvv vvvvv (kk:ii).

 

Så, det jag är ute efter här är att lyckas åstadkomma ett macro där informationen extraheras ur textsträngarna. Jag har gjort detta en gång med hjälp av inbyggda funktioner, men nackdelen är att det blir så otroligt krävande för systemet att köra alla dessa fuktioner simultant att det inte är rimligt att göra detta "i realtid" som funktionerna gör. Jag vill inte ens gå in på hur det jag byggde är uppbyggt för det är helt enkelt fel metod från början.

 

Som du kanske ser så är texten ALLTID likadan beroende på vad för attack det är, i själva verket så är textens forumlering ett värde i sig, eftersom den anger både VAD det är för attack och ifall den är gjord PÅ vårt Kd eller AV vårt Kd. (Det är därför de är grupperade 2 och 2.)

 

Det finns redan ett flertal av dessa script som "formatterar" texten ute på nätet, men inte för Excel, och det är som sagt lite av en hobby att göra en egen.

 

Är det någon som hade kunnat ge mig en knuff i rätt riktning på hur jag borde ta mig an detta problem? Jag har använt väldigt mycket SEARCH & MID för att extrahera texten i mitt förra försök, och jag har t.om byggt egna funktioner som gör om tecken till ORD genom att använda blanksteg som separator, men i textexemplen ovan så ser du kanske att det kan även förekomma mellanslag i ett namn tex. Så jag funderade på om det fanns ett effektivare sätt för mig att extrahera alla värden och lagra de i en ny tabell i ett svep per rad helt enkelt.

 

Exempel nedan baserat på följande sträng:

aaaaaaaaa (kk:ii) invaded and stole from vvvv vvvvvvvv(kk:ii).

 

Tex om man kunde få programmet till att extrahera texten mellan tecken 1 och (kk:ii) som värde1, Mellan ( och ) som värde 2 (vid första förekomsten), kört en ifsats på följande "invaded and stole from" eftersom det här anges vad det är för attack och texten där alltid är statisk. Värde 3 skulle i såfall hämtas från sista tecknet i den texten fram till nästa förekomst av (kk:ii) varpå det sista värdet i denna sträng så skulle hämtar ifrån den andra förekomsten av ( till ).

 

Som du ser så är det inte helt enkelt det här, men jag tror fortfarande det är fullt möjligt.

Link to comment
Share on other sites

Två tankar

  1. Om strängarna alltid ser likadana ut borde det går att ordna utan VBA, med formler. Dvs du har fasta formler som tar ut sin del av strängen till en cell för att senare vidare behandlas om du nu vill det.
  2. Skapa x antal funktioner där varje funktion har sitt ansvar. Funktion 1 plockar ut första delvärdet, funktion 2 delvärde två osv. Det vill säga lös problemet steg för steg.

Fast mmh

Problemet med nummer ett är att det inte finns något givet skiljetecken mellan händelsen och målet för händelsen. Då måste man identifiera händelsen men det torde inte vara omöjligt om du har en lista alla möjliga händelser...

 

ja, se bifogad fil. Duger det? Alltid bra att undvika VBA när det går att undvika. Bara bygga vidare på det :)

Utopia.xls

Link to comment
Share on other sites

*hehe* Det ser nästa precis ut som det jag redan hade. Som jag skrev i första inlägget så har jag redan åstadkommit detta med hjälp av formler utan VBA, men att bläddra igenom detta blad, och ännu värre sortera infon i det gör det alldeles för tungt.

 

Det är just pga detta skälet som jag tror det hade varit effektivare i VBA eftersom man inte belastar datorn lika mycket.

 

Jag tror fullt på din förmåga och vet att du har rätt när du säger att utvecklingsverktygen i excel ska undvikas i möjligaste mån, däremot hade det känns mer logiskt att låta excel göra detta "formatterings arbete" i ett steg och därefter friat upp alla resurser på nytt eftersom allt som återstår är en tabell med värden i istället för en tabell med formler i, om du förstår min poäng.

Link to comment
Share on other sites

ah, ok... men du kan då översätta logiken i formlerna till VBA. no problemo... behövs samma data som hjälp då. Dvs man måste veta vad strängen ska innehålla samt vilka händelser det är som kan förekomma så att man kan söka rätt på rätt delar.

 

Ta det som sagt steg för steg.

 

Skapa en funktion/funktionsteg som tar ut del1 av strängen. Låt

 

 

typ... dummy-kod

Sub MySplitter()
Dim rnSource As Range
Dim rnTarget As Range
Dim sText As String
Dim idx As Integer
Dim iLength As Integer
Set rnSource = Blad1.Range("a3")
Set rnTarget = Blad1.Range("B3")
sText = rnSource
iLength = InStr(1, sText, "(") - 1
rnTarget = Trim(Left(sText, iLength))
idx = iLength + 1
iLength = InStr(1, sText, ")") - idx + 1
rnTarget.Offset(0, 1) = Trim(Mid(sText, idx, iLength))
idx = idx + iLength + 1

Dim strPart As String
strPart = Mid(sText, idx, 10)
Dim rwIndex As Integer
rwIndex = WorksheetFunction.Match(strPart & "*", Blad1.Range("rnActions"), 0)
iLength = Len(Blad1.Range("rnActions").Cells(rwIndex))
rnTarget.Offset(0, 2) = Trim(Mid(sText, idx, iLength))
idx = idx + iLength + 1
iLength = InStr(idx, sText, "(") - idx
rnTarget.Offset(0, 3) = Trim(Mid(sText, idx, iLength))
rnTarget.Offset(0, 4) = Trim(Mid(sText, idx + iLength, 100))

End Sub

 

Gör samma som formlerna på bladet...

Bara utveckla vidare till att passa exakt efter det du önskar samt att den ska ta emot argument med de värden den ska arbeta med men det får du fixa själv :)

Utopia.xls

Link to comment
Share on other sites

Wow. Det ser nice ut. Måste titta på det ett tag innan jag skriver något korkat, men det ser bra ut.

 

Det största problemet med formlerna som jag hade innan och som jag även hade fått med din kod utan VBA är att jag egentligen måste veta vad det är för typ av händelse innan jag kan placera rätt funktioner på den- När jag gjorde den förra blev jag tvungen att nästla IF formler till förbannelse just p.g.a detta.

 

Jag ska undersöka den kod du skrev och återkomma. ^^

Link to comment
Share on other sites

Jag kollade ditt Macro nu, precis som du säker så är det nästan en kopia av varianten utan Macro. Man slipper den tunga uppdateringen, men samma problem återstår i övrigt.

Jag tänker mer att man måste tackla detta problemet från rätt riktning.

 

1. Identifiera händelse i cell A1 från följande alternativ:

 

a= invaded * and captured

b= captured * acres of land

c= invaded * and killed

d= killed * people within

e= attempted to invade

f= attempted an invasion of

g= (Det finns en variant till här)

h= attacked and pillaged the lands of

i= recaptured * acres of land from

j= ambushed armies from

k= attacked and stole from

l= invaded and stole from

 

2. Välj formateringsmetod

 

Om händelse =a ska texten formateras enligt instruktioner "a"

Om händelse =b ska texten formaterad enligt instruktioner "b"

ovs

 

Det är den där biten jag har mest problem med. Att få macrot att göra olika saker beroende på vad den hittar i första cellen.

 

Det bästa hade ju varit ifall man kunde få macrot att fylla i värdena i följande kolumner på samma rad, då kunde det arbetat rad för rad tills det vart tomt i cell A*. Om man dessutom hade bestämt i förväg att kolumn b är "attacker", kolumn c är "victim", kolumn d är "händelsetyp", kolumn e är "acres" och kolumn f är "people" så är upplägget riktigt bra för att kunna göra vidare beräkningar på det.

Link to comment
Share on other sites

Lägg upp ett blad med exempel på rådata och det du vill få ut.

 

Koden jag givit borde innehålla alla "verktyg" du i sig behöver bortsett från stegningen genom cellerna. Problemet av sådan art att jag har svårt att säga exakt hur. Fast ifall du vill lösa det själv minns då denna enkla devis:

bryt upp problemet i sina minsta delar. Lös del för del och slå sedan ihop det till det slutliga du önskar.

 

En bra teknik är att skapa en grundfunktion som hanterar grova händelsen. Sedan skapar man sub-funktioner som denna grundfunktion anropar. Dessa sub-funktioner kan ha uppgifter som

  • Returnera angripare
  • Returnera angripen
  • Returnera aktion

osv. Skapa alla dessa funktioner som kommer att behövs men returnera initialt ett dummy-värde. Utveckla dem sedan en efter en och testa dem var för sig.

När du plockat ut exempelvis aktionen kan du anropa en annan funktion som klassificerar den enligt dina önskemål.

 

Exakt hur du klassifierar? Tja, du har aktionen, säg att du även har en lista på ett arbetsblad med alla möjliga aktioner. I denna lista har du även regeln för hur aktionen ska behandlas. Du söker med andra ord reda på din aktion i listan, läser av regeln och agerar.

 

Exakt vad regeln är... tja, det kan vara en förformaterad sträng som du kopierar exempelvis..

 

Det bästa hade ju varit ifall man kunde få macrot att fylla i värdena i följande kolumner på samma rad, då kunde det arbetat rad för rad tills det vart tomt i cell A*. Om man dessutom hade bestämt i förväg att kolumn b är "attacker", kolumn c är "victim", kolumn d är "händelsetyp", kolumn e är "acres" och kolumn f är "people" så är upplägget riktigt bra för att kunna göra vidare beräkningar på det.

Inget svårt alls om du lägger upp det enligt ovan...

 

Något du klarar av? Om du kan lite programmering och har ett litet hum om VBA-kod ska det inte vara så svårt. Börja med en rad, lägg sist, absolut sist, till att du stegar genom flera rader.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...