Extraer cadenas a la derecha y/o izquierda..(Solucionado)

Extraer cadenas a la derecha y/o izquierda..(Solucionado)

Postby ACC69 » Fri Jul 31, 2015 9: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
Last edited by ACC69 on Sat Aug 01, 2015 12:55 am, edited 1 time in total.
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm

Re: Extraer cadenas a la derecha y/o izquierda..

Postby cnavarro » Fri Jul 31, 2015 10:38 pm

Prueba a ver

Code: Select all  Expand view


#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
User avatar
cnavarro
 
Posts: 6500
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Extraer cadenas a la derecha y/o izquierda..

Postby RSalazarU » 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
RSalazarU
 
Posts: 211
Joined: Wed Jul 16, 2008 12:59 pm
Location: Cochabamba-Bolivia

Re: Extraer cadenas a la derecha y/o izquierda..

Postby ACC69 » 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.
Last edited by ACC69 on Fri Jul 31, 2015 11:59 pm, edited 1 time in total.
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm

Re: Extraer cadenas a la derecha y/o izquierda..

Postby ACC69 » Sat Aug 01, 2015 12:42 am

cnavarro wrote:Prueba a ver

Code: Select all  Expand view


#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
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm

Re: Extraer cadenas a la derecha y/o izquierda..

Postby cnavarro » Sat Aug 01, 2015 12:47 am

Aqui

Code: Select all  Expand view

Local cTemp   := if( lLeft, "", cCar )
 


cambialo por

Code: Select all  Expand view

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
User avatar
cnavarro
 
Posts: 6500
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Extraer cadenas a la derecha y/o izquierda..

Postby ACC69 » Sat Aug 01, 2015 12:54 am

cnavarro wrote:Aqui

Code: Select all  Expand view

Local cTemp   := if( lLeft, "", cCar )
 


cambialo por

Code: Select all  Expand view

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
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm

Re: Extraer cadenas a la derecha y/o izquierda..(Solucionado)

Postby FranciscoA » Sat Aug 01, 2015 3: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: Select all  Expand view
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
User avatar
FranciscoA
 
Posts: 2110
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Extraer cadenas a la derecha y/o izquierda..(Solucionado)

Postby ACC69 » Sat Aug 01, 2015 4: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: Select all  Expand view
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.
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm

Re: Extraer cadenas a la derecha y/o izquierda..(Solucionado)

Postby cnavarro » Sat Aug 01, 2015 4: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: Select all  Expand view

// 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: Select all  Expand view

// 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
User avatar
cnavarro
 
Posts: 6500
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Extraer cadenas a la derecha y/o izquierda..(Solucionado)

Postby ACC69 » Sat Aug 01, 2015 5: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: Select all  Expand view

// 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: Select all  Expand view

// 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.
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm

Re: Extraer cadenas a la derecha y/o izquierda..(Solucionado)

Postby RSalazarU » Tue Aug 04, 2015 11:08 pm

Adrian:

El siguiente codigo tb hace los mismo
Code: Select all  Expand view

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
RSalazarU
 
Posts: 211
Joined: Wed Jul 16, 2008 12:59 pm
Location: Cochabamba-Bolivia


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 81 guests