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

Post Reply
ACC69
Posts: 619
Joined: Tue Dec 12, 2006 7:34 pm
Contact:

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

Post by ACC69 »

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

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

Post by cnavarro »

Prueba a ver

Code: Select all


#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

C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
RSalazarU
Posts: 177
Joined: Wed Jul 16, 2008 12:59 pm
Location: Cochabamba-Bolivia
Contact:

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

Post by RSalazarU »

Adrian:

para el caso de manejo de archivos podrias usar las funciones

cFileNopath() y cFileNoExt()

Aca la documentacion:

http://wiki.fivetechsoft.com/doku.php?i ... filenopath
http://wiki.fivetechsoft.com/doku.php?i ... cfilenoext

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

Espero te ayude.

Rolando
Cochabamba, Bolivia
ACC69
Posts: 619
Joined: Tue Dec 12, 2006 7:34 pm
Contact:

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

Post by ACC69 »

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?i ... filenopath
http://wiki.fivetechsoft.com/doku.php?i ... 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: 619
Joined: Tue Dec 12, 2006 7:34 pm
Contact:

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

Post by ACC69 »

cnavarro wrote:Prueba a ver

Code: Select all


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

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

Post by cnavarro »

Aqui

Code: Select all

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

Code: Select all

Local cTemp   := ""
 
y me comentas
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
ACC69
Posts: 619
Joined: Tue Dec 12, 2006 7:34 pm
Contact:

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

Post by ACC69 »

cnavarro wrote:Aqui

Code: Select all

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

Code: Select all

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
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

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

Post by FranciscoA »

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

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.

Fwxh1204-MySql-TMySql
ACC69
Posts: 619
Joined: Tue Dec 12, 2006 7:34 pm
Contact:

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

Post by ACC69 »

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

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

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

Post by cnavarro »

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

// 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

// 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
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
ACC69
Posts: 619
Joined: Tue Dec 12, 2006 7:34 pm
Contact:

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

Post by ACC69 »

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

// 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

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

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

Post by RSalazarU »

Adrian:

El siguiente codigo tb hace los mismo

Code: Select all

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
Post Reply