FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Extraer cadenas a la derecha y/o izquierda..(Solucionado)
Posts: 632
Joined: Tue Dec 12, 2006 07:34 PM
Extraer cadenas a la derecha y/o izquierda..(Solucionado)
Posted: Fri Jul 31, 2015 09:34 PM
Hola buenas tardes de antemano les envio cordial saludos.

Requiero la ayuda de ustedes,que espero me puedan ayudar con un detalle que no le hallo como extraer cadenas a la derecha como puedo hacer eso:

Pongo el ejemplo:

cSelDbf := C:\PROY_HB\PROVEEDOR\EMP07\CATALOGO.DBF"
cSelDbf:=SubStr(cSelDbf,RAt("\",cSelDbf)+1,Len(cSelDbf)) Usando la funcion RAT() me extrae la ultima cadena "\" y el resultato CATALOGO.DBF....


Pero quiero extraer la cadena a la derecha y me de el resultado EMP07\CATALOGO.DBF

Aunque muchas veces pueda que cambie el tamaño de la ruta que en lugar :

cSelDbf := C:\PROY_HB\PROVEEDOR\ADRIANCASANOVA\CATALOGO.DBF" Y obtenga el resultado ADRIANCASANOVA\CATALOGO.DBF Se podra ?

Esperando en el foro que alguien me pueda apoyar alguna funcioncita de como extraer cadenas a la derecha o izquierda ...con tal de extraer menos dos diagonales y obtener el resultado de la cadena

Saludos cordiales .

Atte: Adrian C. C.
acc69@hotmail.com
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Extraer cadenas a la derecha y/o izquierda..
Posted: Fri Jul 31, 2015 10:38 PM
Prueba a ver

Code (fw): Select all Collapse
#include "fivewin.ch"

Static cExtrae

Function Main()
   Local cCad := "C:\PROY_HB\PROVEEDOR\EMP07\CATALOGO.DBF"
   Local cCar  := "\"
   Local nPos := 2
   Local lLeft := .T.
   Local cResult := ""
   
   cExtrae   := ""
   cResult   := ExtraeCad( cCad, cCar, nPos, lLeft )
   ? cResult
   ? ExtraeToken( cCad, cCar, nPos, lLeft )

   lLeft := .F.     // Right
   cExtrae   := ""
   cResult   := ExtraeCad( cCad, cCar, nPos, lLeft )
   ? cResult
   ? ExtraeToken( cCad, cCar, nPos, lLeft )

Return nil

// Antes de conocer Tokens...

Function ExtraeCad( cCad, cCar, nPos, lLeft )
    Local nL          := Len( cCad )
    Local nP          := if( lLeft, At( cCar, cCad ), Rat( cCar, cCad ) )
    Local cTemp   := ""

    if !Empty( nP )
       cTemp     := cExtrae
       cExtrae    := if( lLeft, Left( cCad, nP ), Right( cCad, nL - nP + 1) )
       if !Empty( cExtrae )
          if lLeft
            cExtrae    := cTemp + cExtrae 
          else
            cExtrae    := cExtrae + cTemp 
          endif
      endif
      nPos --
      if nPos > 0
         ExtraeCad( if( lLeft, Right( cCad, nL - nP ), Left( cCad, nP-1 ) ) , cCar, nPos, lLeft )
      endif
   endif
Return cExtrae

// Uso de tokens....

Function ExtraeToken( cCad, cCar, nPos, lLeft )   //cString, cNewToken, nNr, cSepChar )
Local aTokens  := hb_atokens( cCad, cCar )
Local m            := if( lLeft, nPos, Len( aTokens ) )
Local n             := if( lLeft, 1, Len( aTokens ) - nPos + 1 )
Local x
Local cTemp   := if( lLeft, "", cCar )
For x := n to m
      cTemp += aTokens[ x ] + if( x < m, cCar, "" )
Next x
Return cTemp
Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 211
Joined: Wed Jul 16, 2008 12:59 PM
Re: Extraer cadenas a la derecha y/o izquierda..
Posted: Fri Jul 31, 2015 11:03 PM
Adrian:

para el caso de manejo de archivos podrias usar las funciones

cFileNopath() y cFileNoExt()

Aca la documentacion:

http://wiki.fivetechsoft.com/doku.php?id=fivewin_funcion_cfilenopath
http://wiki.fivetechsoft.com/doku.php?id=fivewin_funcion_cfilenoext

Si es para otro tipo de aplicacion, entonces a programar...

Espero te ayude.

Rolando
Cochabamba, Bolivia
Posts: 632
Joined: Tue Dec 12, 2006 07:34 PM
Re: Extraer cadenas a la derecha y/o izquierda..
Posted: Fri Jul 31, 2015 11:55 PM
RSalazarU wrote:Adrian:

para el caso de manejo de archivos podrias usar las funciones

cFileNopath() y cFileNoExt()

Aca la documentacion:

http://wiki.fivetechsoft.com/doku.php?id=fivewin_funcion_cfilenopath
http://wiki.fivetechsoft.com/doku.php?id=fivewin_funcion_cfilenoext

Si es para otro tipo de aplicacion, entonces a programar...

Espero te ayude.

Rolando
Cochabamba, Bolivia



Gracias Ing. Navarroo por tu interes, pruebo la funcion y te comento,

C:\PROY_HB\PROVEEDOR\EMP07\CATALOGO.DBF"

Gracias Ing, Rolando, solo quiero extraer la cadena EMP07\CATALOGO.DBF como una ruta unica ,como lo hace la funcion nativa de RAT, solo que valida la ulltima diagonal "\" ...cuando puede haber hasta 4 diagonales ,es lo que ando queriendo extraer como segunda diagonal a la derecha o izquierda y extraer la cadena EMP07\CATALOGO.DBF

C:\PROY_HB\PROVEEDOR\EMP07\CATALOGO.DBF"

Asi quiero que quede o me extraiga la cadena EMP07\CATALOGO.DBF

Gracias Ing. Navarro probare la funcion y le comento
Gracias Rolando por su atencion.

Atte: Adrian C. C.
Posts: 632
Joined: Tue Dec 12, 2006 07:34 PM
Re: Extraer cadenas a la derecha y/o izquierda..
Posted: Sat Aug 01, 2015 12:42 AM
cnavarro wrote:Prueba a ver

Code (fw): Select all Collapse
#include "fivewin.ch"

Static cExtrae

Function Main()
   Local cCad := "C:\PROY_HB\PROVEEDOR\EMP07\CATALOGO.DBF"
   Local cCar  := "\"
   Local nPos := 2
   Local lLeft := .T.
   Local cResult := ""
   
   cExtrae   := ""
   cResult   := ExtraeCad( cCad, cCar, nPos, lLeft )
   ? cResult
   ? ExtraeToken( cCad, cCar, nPos, lLeft )

   lLeft := .F.     // Right
   cExtrae   := ""
   cResult   := ExtraeCad( cCad, cCar, nPos, lLeft )
   ? cResult
   ? ExtraeToken( cCad, cCar, nPos, lLeft )

Return nil

// Antes de conocer Tokens...

Function ExtraeCad( cCad, cCar, nPos, lLeft )
    Local nL          := Len( cCad )
    Local nP          := if( lLeft, At( cCar, cCad ), Rat( cCar, cCad ) )
    Local cTemp   := ""

    if !Empty( nP )
       cTemp     := cExtrae
       cExtrae    := if( lLeft, Left( cCad, nP ), Right( cCad, nL - nP + 1) )
       if !Empty( cExtrae )
          if lLeft
            cExtrae    := cTemp + cExtrae 
          else
            cExtrae    := cExtrae + cTemp 
          endif
      endif
      nPos --
      if nPos > 0
         ExtraeCad( if( lLeft, Right( cCad, nL - nP ), Left( cCad, nP-1 ) ) , cCar, nPos, lLeft )
      endif
   endif
Return cExtrae

// Uso de tokens....

Function ExtraeToken( cCad, cCar, nPos, lLeft )   //cString, cNewToken, nNr, cSepChar )
Local aTokens  := hb_atokens( cCad, cCar )
Local m            := if( lLeft, nPos, Len( aTokens ) )
Local n             := if( lLeft, 1, Len( aTokens ) - nPos + 1 )
Local x
Local cTemp   := if( lLeft, "", cCar )
For x := n to m
      cTemp += aTokens[ x ] + if( x < m, cCar, "" )
Next x
Return cTemp


Gracias Ing. Navarro, si funciono!...pero...ahora como le quito la diagonal "\" al principio porque me muestra asi :

\EMP07\CATALOGO.DBF

Y solo quiero que me muestre sin la diagonal al principio :
EMP07\CATALOGO.DBF

Voy a estudiar su funcion y ver de donde modificarle .... o que me indique que parametro modificarle y que no me muestre la diagonal al principio.

Gracias por tu tiempo y la rutina que compartio.

Muy agradecido.

Saludos cordiales

Atte: Adrian C. C.
acc69@hotmail.com
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Extraer cadenas a la derecha y/o izquierda..
Posted: Sat Aug 01, 2015 12:47 AM
Aqui

Code (fw): Select all Collapse
Local cTemp   := if( lLeft, "", cCar )


cambialo por

Code (fw): Select all Collapse
Local cTemp   := ""


y me comentas
Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 632
Joined: Tue Dec 12, 2006 07:34 PM
Re: Extraer cadenas a la derecha y/o izquierda..
Posted: Sat Aug 01, 2015 12:54 AM
cnavarro wrote:Aqui

Code (fw): Select all Collapse
Local cTemp   := if( lLeft, "", cCar )


cambialo por

Code (fw): Select all Collapse
Local cTemp   := ""


y me comentas



Gracias de nuevo Ing. Navarro no me habia dado cuenta que tiene dos funciones distintas y me confundi de cambiarle.
Le agradezco mucho su ayuda.

Saludos .

Atte: Adrian C. C.
acc69@hotmail.com
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: Extraer cadenas a la derecha y/o izquierda..(Solucionado)
Posted: Sat Aug 01, 2015 03:54 AM
Adrian.
Se que lo haz solucionado con el excelente codigo de Carlos Navarro.

Por otro lado, suponiendo que controlas, en una variable, el path principal de tu aplicacion, creo que también podrías hacer:

Code (fw): Select all Collapse
Function ExtraeCad()
Local cDir
Local cCad := "C:\PROY_HB\PROVEEDOR\EMP07\CATALOGO.DBF"
local nSubCad1
Local nSubCad2 := Len(cCad) 

//cDir := "C:\PROY_HB\PROVEEDOR"      //controlando el path principal sin "\" al final
cDir := "C:\PROY_HB\PROVEEDOR\"      //controlando el path principal con "\ al final  

nSubCad1 := Len(cDir)+ if(Right(cDir,1,1)="\",1,2)
Return MsgInfo( SubStr(cCad, nSubCad1, nSubCad2) )


Saludos.
Francisco J. Alegría P.

Chinandega, Nicaragua.



Fwxh-MySql-TMySql
Posts: 632
Joined: Tue Dec 12, 2006 07:34 PM
Re: Extraer cadenas a la derecha y/o izquierda..(Solucionado)
Posted: Sat Aug 01, 2015 04:07 PM
FranciscoA wrote:Adrian.
Se que lo haz solucionado con el excelente codigo de Carlos Navarro.

Por otro lado, suponiendo que controlas, en una variable, el path principal de tu aplicacion, creo que también podrías hacer:

Code (fw): Select all Collapse
Function ExtraeCad()
Local cDir
Local cCad := "C:\PROY_HB\PROVEEDOR\EMP07\CATALOGO.DBF"
local nSubCad1
Local nSubCad2 := Len(cCad) 

//cDir := "C:\PROY_HB\PROVEEDOR"      //controlando el path principal sin "\" al final
cDir := "C:\PROY_HB\PROVEEDOR\"      //controlando el path principal con "\ al final  

nSubCad1 := Len(cDir)+ if(Right(cDir,1,1)="\",1,2)
Return MsgInfo( SubStr(cCad, nSubCad1, nSubCad2) )


Saludos.



Hola buenos dias Ing. Francisco, gracias por tu interes y tu tiempo y compartir tu codigo ,funciona bien y hace lo que necesito .
Exactamente como tu dices tengo un archivo proveedor.ini para la ruta de archivos comunes que indico como path y para bases de datos la ruta EMP01\CATALOGO.DBF de datos de movimientos de cada empresa y es asi como lo tengo y ya lo tengo mejorado, que ya puedo accesar en redes del servidor sin necesidad de crear la unidad a compartir ,asi ya estare mas tranquilo que no podran eliminar carpetas por error o acccidental,solo eso me faltaba extraer EMP07\CATALOGO.DBF para que no tenga que hace un USE C:\PROY_HB\EMPRESAS\EMP01 y minimizar que haga el use EMPRESAS\EMP01 sin la diagonal, ya que con la diagona\ marca error al hacer USE ,por eso la necesidad de extraer la cadena a la derecha y gracias de nuevo por compartir su codigo .

Las tres funciones son muy buenas ,ayer precisamente queria ver como modificar la funcion ExtraeCad() del Ing. Cristobal Navarro que no me muestre la diagonal al principio y no le halle, estuve revisando y depurando su funcion del Ing. Cristobal y nada,solo el Ing. sabe y conoce su funcion ,y asi tenerlo las tres alternativas funciones que pueden servir .

Gracias a ambos .

Saludos y buen dia.

Atte: Adrian C. C.
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Extraer cadenas a la derecha y/o izquierda..(Solucionado)
Posted: Sat Aug 01, 2015 04:32 PM
Adrian

El codigo tiene dos funciones que hacen lo mismo: una sin utilizar los tokens de harbour y otra mejor, segun mi opinion, que los utiliza

Code (fw): Select all Collapse
// Antes de conocer Tokens...

Function ExtraeCad( cCad, cCar, nPos, lLeft )
    Local nL          := Len( cCad )
    Local nP          := if( lLeft, At( cCar, cCad ), Rat( cCar, cCad ) )
    Local cTemp   := ""

    if !Empty( nP )
       cTemp     := cExtrae
       cExtrae    := if( lLeft, Left( cCad, nP ), Right( cCad, nL - nP + 1) )
       if !Empty( cExtrae )
          if lLeft
            cExtrae    := cTemp + cExtrae 
          else
            cExtrae    := cExtrae + cTemp 
          endif
      endif
      nPos --
      if nPos > 0
         ExtraeCad( if( lLeft, Right( cCad, nL - nP ), Left( cCad, nP-1 ) ) , cCar, nPos, lLeft )
      endif
   endif
Return cExtrae


Code (fw): Select all Collapse
// Uso de tokens....

Function ExtraeToken( cCad, cCar, nPos, lLeft )   //cString, cNewToken, nNr, cSepChar )
Local aTokens  := hb_atokens( cCad, cCar )
Local m            := if( lLeft, nPos, Len( aTokens ) )
Local n             := if( lLeft, 1, Len( aTokens ) - nPos + 1 )
Local x
Local cTemp   := if( lLeft, "", cCar )
For x := n to m
      cTemp += aTokens[ x ] + if( x < m, cCar, "" )
Next x
Return cTemp


En esta ultima, creo que ya está hecha la modificacion para que no te aparezca al principio el \
Espero te sirva
Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 632
Joined: Tue Dec 12, 2006 07:34 PM
Re: Extraer cadenas a la derecha y/o izquierda..(Solucionado)
Posted: Sat Aug 01, 2015 05:07 PM
cnavarro wrote:Adrian

El codigo tiene dos funciones que hacen lo mismo: una sin utilizar los tokens de harbour y otra mejor, segun mi opinion, que los utiliza

Code (fw): Select all Collapse
// Antes de conocer Tokens...

Function ExtraeCad( cCad, cCar, nPos, lLeft )
    Local nL          := Len( cCad )
    Local nP          := if( lLeft, At( cCar, cCad ), Rat( cCar, cCad ) )
    Local cTemp   := ""

    if !Empty( nP )
       cTemp     := cExtrae
       cExtrae    := if( lLeft, Left( cCad, nP ), Right( cCad, nL - nP + 1) )
       if !Empty( cExtrae )
          if lLeft
            cExtrae    := cTemp + cExtrae 
          else
            cExtrae    := cExtrae + cTemp 
          endif
      endif
      nPos --
      if nPos > 0
         ExtraeCad( if( lLeft, Right( cCad, nL - nP ), Left( cCad, nP-1 ) ) , cCar, nPos, lLeft )
      endif
   endif
Return cExtrae


Code (fw): Select all Collapse
// Uso de tokens....

Function ExtraeToken( cCad, cCar, nPos, lLeft )   //cString, cNewToken, nNr, cSepChar )
Local aTokens  := hb_atokens( cCad, cCar )
Local m            := if( lLeft, nPos, Len( aTokens ) )
Local n             := if( lLeft, 1, Len( aTokens ) - nPos + 1 )
Local x
Local cTemp   := if( lLeft, "", cCar )
For x := n to m
      cTemp += aTokens[ x ] + if( x < m, cCar, "" )
Next x
Return cTemp


En esta ultima, creo que ya está hecha la modificacion para que no te aparezca al principio el \
Espero te sirva



Si gracias Ing. Cristobal Navarro, en esta ultima ya esta hecha la modificacion y funciona al 100% ,solo queria modificar la primera ExtraeCad() ,pero no la halle como traducirla, pero bueno ,todo esta bien gracias Ing. yo aqui sigo con otros detalles mas de mi programa.

Le agradezco su atencion de nuevo.

Saludos y buen fin de semana !

Atte: Adrian C. C.
Posts: 211
Joined: Wed Jul 16, 2008 12:59 PM
Re: Extraer cadenas a la derecha y/o izquierda..(Solucionado)
Posted: Tue Aug 04, 2015 11:08 PM
Adrian:

El siguiente codigo tb hace los mismo
Code (fw): Select all Collapse
local cFile :="C:\PROY_HB\PROVEEDOR\EMP07\CATALOGO.DBF"
cFile:=cFilename(LEFT(cFilePath(cFile),LEN(cFilePath(cFile))-1)) +"\"+ cFilename(cFile)
msginfo(cFile)



Sin la intencion de polemizar.


Atentamente,

Rolando
Cochabamba, Bolivia

Continue the discussion