>Clear >TEXT to lcSamples noshow >B10 TS 4004, 100 N Main St, TX, 05, WM, 132lbs, 62", More Comments >C32 TS ABC123, TX, 2005, 100 N MAIN ST, 2 CHILDREN IN VEH >A10 TS 100 N MAIN ST, ABC123, SC, 06, WM 150LBS 60" >C10 TS SC, 4003, 04, 100 N MAIN ST >ENDTEXT > >loParser = Createobject('myParser') >loParser.Parse(m.lcSamples) >For px=1 To Alen(loParser.aProcessed) > ? 'Record#',m.px,; > loParser.aProcessed[m.px].Id,; > loParser.aProcessed[m.px].vlTagYEar,; > loParser.aProcessed[m.px].vlTagState,; > loParser.aProcessed[m.px].location,; > loParser.aProcessed[m.px].vlTag, ; > loParser.aProcessed[m.px].Comments >Endfor > >Define Class myParser As Custom > cStates = 'AR,WY,TX,SC,NY' > Procedure Init > Endproc > > Procedure Parse(tcText) > Local ix > Local Array aProcess[1] > lnLines = Alines(aProcess,m.tcText) > This.AddProperty('aProcessed['+Transform(m.lnLines)+']') > > Create Cursor _dummy_ (Id i,vltag i,vltagstate i,vltagyear i,location i,comments i) > For ix=1 To Alines(aProcess,m.tcText) > Scatter Name This.aProcessed[m.ix] Blank > This.aProcessed[m.ix].Id = Alltrim(Strextract(aProcess[m.ix],'',' TS ')) > This.ProcessLine(aProcess[m.ix],m.ix) > Endfor > Use In _dummy_ > Endproc > > Procedure ProcessLine(tcLine,tnObjectID) > * ? m.tcLine, m.tnObjectID > Local lcParse,lnWords,ix > lcParse = Strextract(m.tcLine,' TS ') > lnWords = Getwordcount( m.lcParse,',' ) > Local Array aPhrases[Max(m.lnWords,5)] > aPhrases = '' > For ix=1 To m.lnWords > aPhrases[m.ix] = Alltrim(Getwordnum( m.lcParse,m.ix,',' )) > Endfor > This.parseItems(@aPhrases,m.tnObjectID) > Endproc > > Procedure ParseItems(taPhrases,m.tnObjectID) > With This.aProcessed[m.tnObjectID] > .vlTagYear = This.FindYear(@taPhrases) > .vlTagState = This.FindState(@taPhrases) > .location = This.FindLocation(@taPhrases) > .vlTag = This.FindTag(@taPhrases) > .comments = This.getRest(@taPhrases) > Endwith > Endproc > > Procedure FindYear(taPhrases) > Local ix,lnYear > For ix=1 To Alen(taPhrases) > If This.IsYear(taPhrases[m.ix]) && actually VFP is smart and this might be much shorter > lnYear = Year(Ctod('1/1/'+taPhrases[m.ix])) > Adel(taPhrases,m.ix) > Dimension taPhrases[Alen(taPhrases)-1] > Return m.lnYear > Endif > Endfor > Return 0 > Endproc > > Procedure FindState(taPhrases) > Local ix,lcState > For ix=1 To Alen(taPhrases) > If taPhrases[m.ix] $ This.cStates And Len(taPhrases[m.ix]) = 2 > lcState = taPhrases[m.ix] > Adel(taPhrases,m.ix) > Dimension taPhrases[Alen(taPhrases)-1] > Return m.lcState > Endif > Endfor > Return '' > Endproc > > Procedure FindLocation(taPhrases) > Local ix,lcLocation > For ix=1 To Alen(taPhrases) > If ( Isdigit(taPhrases[m.ix]) And Occurs(' ', taPhrases[m.ix]) > 0 ) Or ; > ( '/\' $ taPhrases[m.ix] ) > lcLocation = taPhrases[m.ix] > Adel(taPhrases,m.ix) > Dimension taPhrases[Alen(taPhrases)-1] > Return m.lcLocation > Endif > Endfor > Return '' > Endproc > > Procedure FindTag(taPhrases) > Local ix,lcTag > For ix=1 To Alen(taPhrases) > If ( Occurs(' ', taPhrases[m.ix]) = 0 ) > lcTag = taPhrases[m.ix] > Adel(taPhrases,m.ix) > Dimension taPhrases[Alen(taPhrases)-1] > Return m.lcTag > Endif > Endfor > Return '' > Endproc > > Procedure getRest(taPhrases) > Local ix,lcComments > lcComments = '' > For ix=1 To Alen(taPhrases) > If ( !Empty(taPhrases[m.ix]) ) > lcComments = taPhrases[m.ix] + Space(1) > Endif > Endfor > Return Trim(m.lcComments) > Endproc > > > Procedure IsAllDigit(tcValue) > Return Empty(Chrtran(m.tcValue,'0123456789','')) > Endproc > > Procedure IsYear(tcValue) > Return This.IsAllDigit(m.tcValue) And ; > InList(Len(m.tcValue),2,4) And ; > BETWEEN(Year(Ctod('1/1/'+m.tcValue)),Year(Date())-3,Year(Date())+1) > Endproc >Enddefine >Cetin