* GotFocus
IF EMPTY(this.Text)
thisform.nuevas=""
thisform.repetidas=""
ENDIF
* KeyPress
LPARAMETERS nKeyCode, nShiftAltCtrl
IF nKeyCode = 13
thisform.Contarpalabras(This)
ENDIF
* LostFocus
thisform.Contarpalabras(This)
* ContarPalabas (Method)
LPARAMETERS toEdit
*<DefineConstants>
#DEFINE _TAB_ CHR(9)
#DEFINE _CL_ CHR(10)
#DEFINE _CR_ CHR(13)
#DEFINE _SPA_ CHR(32)
#DEFINE _COMA_ ","
#DEFINE _PUNTO_ "."
#DEFINE _PUNCOMA_ ";"
#DEFINE _DOSPUN_ ":"
#DEFINE _COMID_ CHR(34)
#DEFINE _COMIS_ CHR(39)
#DEFINE _PAROP_ CHR(40)
#DEFINE _PARCLO_ CHR(41)
#DEFINE _BRAKOP_ CHR(91)
#DEFINE _BRAKCLO_ CHR(93)
*</DefineConstants>
*<DeclareLocals>
LOCAL lcNuevas,;
lcRepetidas,;
lcReempla,;
lnWords,;
i,;
lctype,;
lcString,;
loReturn as Object
LOCAL ARRAY laWords(1)
*</DeclareLocals>
*<CheckParameters>
lcType = VARTYPE(toEdit)
DO CASE
CASE m.lctype = "O"
* May be an Editbox Object
lcString = toEdit.Text
CASE m.lcType ="C"
IF FILE(m.toEdit)
* May be a file
lcString = FILETOSTR(m.toEdit)
ELSE
* May be a Character Variable
lcString = m.toEdit
ENDIF
OTHERWISE
lcString = ""
ENDCASE
*</CheckParameters>
*<AssignValues>
lcNuevas = CHR(13)
lcRepetidas = CHR(13)
lcReempla = _COMA_+_PUNTO_+_PUNCOMA_+_DOSPUN_+_COMID_+_COMIS_ + _PAROP_ + _PARCLO_ + _BRAKOP_ + _BRAKCLO_
*</AssignValues>
*<DetectWords>
lnWords = ALINES(laWords, LOWER(CHRTRAN(m.lcString , m.lcReempla , _SPA_ )) , 1+4 , _TAB_,_CL_,_CR_,_SPA_ )
IF lnWords > 0
ASORT(laWords)
ENDIF
FOR i=1 TO lnWords
IF ATC(_CR_ + laWords[i] + _CR_ , m.lcNuevas ) = 0
lcNuevas = m.lcNuevas ;
+ laWords[i] + _CR_
ELSE
IF ATC(_CR_ + laWords[i] + _CR_ , m.lcRepetidas ) = 0
lcRepetidas = m.lcRepetidas ;
+ laWords[i] + _CR_
ENDIF
ENDIF
NEXT
*</DetectWords>
*<CreateReturnValue>
lcNuevas = SUBSTR(m.lcNuevas,2)
lcRepetidas = SUBSTR(m.lcRepetidas,2)
IF PEMSTATUS(Thisform,"nuevas",5) AND PEMSTATUS(Thisform,"repetidas",5)
WITH thisform
.nuevas = .nuevas + m.lcNUevas
.repetidas = .repetidas + m.lcRepetidas
ENDWITH
ENDIF
* Return an object with 3 Properties: "Nueva","Repetidas" y "Count"
loReturn = NEWOBJECT("empty")
ADDPROPERTY(loReturn,"Nuevas",m.lcNuevas)
ADDPROPERTY(loReturn,"Repetidas",m.lcRepetidas)
ADDPROPERTY(loReturn,"Count",m.lnWords)
*</CreateReturnValue>
RETURN loReturn
oForm = NEWOBJECT("Form")
WITH oform
.Caption = "Palabras Repetidas"
.Height = 300
.Width = 400
.MaxWidth = 400
.MinWidth = 400
.MinHeight = 100
.backcolor = RGB(184,201,197)
.AutoCenter = .t.
ENDWITH
oform.newobject("edt_Repetidas","Editbox")
oform.newObject("edt_Nuevas","Editbox")
WITH oform.edt_Repetidas
.top = 3
.left = 3
.Height = 280
.Width = 190
.SpecialEffect = 1
.BorderColor = RGB(114,136,141)
.Readonly = .t.
.DisabledBackcolor=RGB(255,255,255)
.Value = thisform.repetidas
.visible=.t.
.Anchor = 5
ENDWITH
WITH oform.edt_Nuevas
.top = 3
.left = 203
.Height = 280
.Width = 190
.SpecialEffect = 1
.BorderColor = RGB(114,136,141)
.Readonly = .t.
.DisabledBackcolor=RGB(255,255,255)
.Value = thisform.nuevas
.Visible = .t.
.Anchor = 5
ENDWITH
oform.Show(1)
PROCEDURE WORD_PARSER
LPARAMETERS tcString
* tcString may be a Text File or a String
IF VARTYPE(tcSTring)#"C"
RETURN ""
ENDIF
IF FILE(tcString)
tcSTring = FILETOSTR(tcString)
ENDIF
LOCAL lcString,lcLetras,lcSpecial,lcPut,i,;
lnDim,;
lnWords,;
lnMaxLenght,;
lnMaxCount
LOCAL ARRAY laUsedWords(1,2),laWords(1)
lnDim = 0
*<Determinar las letras>
lcLetras=""
* UpperCase
FOR i = 65 TO 90
lcLetras = lcLetras + CHR(i)
NEXT
* LowerCase
FOR i= 97 TO 122
lcLetras = lcletras + CHR(i)
NEXT
* Ñ ñ
lcLetras = lcLetras + CHR(209) + CHR(241)
FOR i = 192 TO 197
lcLetras = lcLetras + CHR(i)
NEXT
FOR i = 200 TO 207
lcLetras = lcLetras + CHR(i)
NEXT
FOR i = 210 TO 214
lcLetras = lcLetras + CHR(i)
NEXT
FOR i = 217 TO 220
lcLetras = lcLetras + CHR(i)
NEXT
FOR i = 224 TO 228
lcLetras = lcLetras + CHR(i)
NEXT
FOR i = 232 TO 235
lcLetras = lcLetras + CHR(i)
NEXT
FOR i = 236 TO 239
lcLetras = lcLetras + CHR(i)
NEXT
FOR i = 242 TO 246
lcLetras = lcLetras + CHR(i)
NEXT
FOR i = 249 TO 252
lcLetras = lcLetras + CHR(i)
NEXT
*</Determinar las letras>
*<Determinar caracteres especiales>
lcSpecial = ""
FOR i=1 TO 8
lcSpecial = lcSpecial + CHR(i)+CHR(11)+CHR(12)
NEXT
FOR i= 14 TO 31
lcSpecial = lcSpecial + CHR(i)
NEXT
FOR i = 33 TO 255
lcChar = CHR(i)
IF AT(lcChar,m.lcLetras) = 0
lcSpecial = lcSpecial + lcChar
ENDIF
NEXT
*</Determinar caracteres especiales>
* Reemplazamos todosl los caracteres especiales por espacio en blanco.
lcString = CHRTRAN(tcSTring , m.lcSpecial, CHR(32) )
* Generamos una array (laWords) donde cada elemento es una palabra
lnWords = ALINES(laWords , LOWER( m.lcString ) , 1 + 4 ,CHR(9) ,CHR(10),CHR(13),CHR(32) )
*<Armar una cadena para devolución>
lcWords = ""
lnMaxLenght = 0
lnMaxCount = 0
FOR i= 1 TO lnWords
lcWords = lcWords ;
+laWords[i]+ CHR(13)
lnAscan = ASCAN(laUsedWords , laWords[i],1,0,0,7)
IF lnAscan = 0
lnDim = lndim + 1
DIMENSION laUsedWords(lnDim,2)
laUsedWords[lnDim,1]=laWords[i]
laUsedWords[lnDim,2]= 1
lnMaxLenght = MAX(lnMaxLenght , LEN(laWords[i]))
ELSE
laUsedWords[lnAscan + 1 ] = laUsedWords[lnAscan + 1 ] + 1
lnMaxCount = MAX(lnMaxCount , laUsedWords[lnAScan + 1] )
ENDIF
NEXT
*</Armar una cadena para devolución>
*<Generar Texto de Informe>
lcPut = "<tcString>"+CHR(13);
+tcString + CHR(13) ;
+"</tcString>"+CHR(13)+CHR(13) ;
+"<lcString>" + CHR(13);
+lcString + CHR(13);
+"</lcString>"+CHR(13)+CHR(13);
+"<Words>"+CHR(13)
FOR i=1 TO m.lnWords
lcPut = lcPut + CHR(9) + laWords[i] + CHR(13)
NEXT
lcPut = lcPut + "</Words>"+CHR(13)+CHR(13);
+"<UsedWords>"+CHR(13);
+ CHR(9)+"<Count>"+TRANSFORM(m.lnDim)+"</Count>"+CHR(13);
+ CHR(9)+"<List>"+CHR(13)
FOR i=1 TO m.lndim
lcPut = lcPut ;
+ REPLICATE(CHR(9),2);
+PADR(laUsedWords[i,1],lnMaxLenght+1, CHR(32)) ;
+TRANSFORM(laUsedWords[i,2],REPLICATE("9",lnMaxCount)) ;
+CHR(13)
NEXT
lcPut = lcPut ;
+CHR(9)+"</List>" + CHR(13);
+"</UsedWords>" + CHR(13)
*</Generar Texto de Informe>
STRTOFILE(m.lcPut ,"WordParser.txt")
MODIFY FILE WordParser.txt NOEDIT