Extraer cadenas a la derecha y/o izquierda..(Solucionado)
Extraer cadenas a la derecha y/o izquierda..(Solucionado)
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
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.
Re: Extraer cadenas a la derecha y/o izquierda..
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.
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.
Re: Extraer cadenas a la derecha y/o izquierda..
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
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
Re: Extraer cadenas a la derecha y/o izquierda..
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.
Re: Extraer cadenas a la derecha y/o izquierda..
Gracias Ing. Navarro, si funciono!...pero...ahora como le quito la diagonal "\" al principio porque me muestra asi :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
\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
Re: Extraer cadenas a la derecha y/o izquierda..
Aqui
cambialo por
y me comentas
Code: Select all
Local cTemp := if( lLeft, "", cCar )
Code: Select all
Local 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.
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.
Re: Extraer cadenas a la derecha y/o izquierda..
cnavarro wrote:Aqui
cambialo porCode: Select all
Local cTemp := if( lLeft, "", cCar )
y me comentasCode: Select all
Local cTemp := ""
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
- 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)
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:
Saludos.
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) )
Francisco J. Alegría P.
Chinandega, Nicaragua.
Fwxh1204-MySql-TMySql
Chinandega, Nicaragua.
Fwxh1204-MySql-TMySql
Re: Extraer cadenas a la derecha y/o izquierda..(Solucionado)
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:
Saludos.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) )
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.
Re: Extraer cadenas a la derecha y/o izquierda..(Solucionado)
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
En esta ultima, creo que ya está hecha la modificacion para que no te aparezca al principio el \
Espero te sirva
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
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.
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.
Re: Extraer cadenas a la derecha y/o izquierda..(Solucionado)
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
En esta ultima, creo que ya está hecha la modificacion para que no te aparezca al principio el \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
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.
Re: Extraer cadenas a la derecha y/o izquierda..(Solucionado)
Adrian:
El siguiente codigo tb hace los mismo
Sin la intencion de polemizar.
Atentamente,
Rolando
Cochabamba, Bolivia
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