Clipper/FiveWin - Caracter enter

   
Vista:

Caracter enter

Publicado por MR (6 intervenciones) el 23/02/2009 23:08:18
Hola Gente!!
Espero que me puedan dar una manito porque estoy trabada con algo y no lo puedo resolver. Tengo que leer desde un puerto serial datos que me envia un aparato. Esto lo dejo en un archivo de texto para luego pasarlo a un dbf y poder tratarlo. El archivo que obtengo de la lectura desde el puerto es del tipo.Seria del tipo
♣☻1H|^&|||2090007|||||||P|6146010-10-02♪P|1♪O|1||1^50001^1^1^SAMPLE||R||||||X|||20090213100318♪R|1|^^^1|1.012|||||♪C|1|I||I♪R|2|^^^2|6.5|||||♪C ......
Lo que necesito es separar los datos
♣☻1H|^&|||2090007|||||||P|6146010-10-02♪
P|1♪O|1||1^50001^1^1^SAMPLE||R||||||X|||20090213100318♪
R|1|^^^1|1.012|||||♪
C|1|I||I♪
R|2|^^^2|6.5|||||♪
C.....
Es decir que tengo que ubicar el Enter que es lo que me define mi fin de registro...He probado con Chr(13), , y no hay caso. El enter al ser leido lo elimina y me deja la misma cadena sin el simbolo ♪
Tambien probe con append from delimited y me elimina lo que sigue al enter...no me sirve...
Alguien tiene idea de como puedo resolver esto???
Desde ya muchas gracias!!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Caracter enter

Publicado por jose (2 intervenciones) el 24/02/2009 10:06:19
Prueba con esto a ver si te vale:

Creas la base de datos:
dbCreate("Fichero.DBF",{{"TEXTO","C",255,0}}

Despues "añades" datos desde el fichero de texto.

Use "Fichero.dbf" new
Append from SDF "Fichero.TXT" // Esto añade las lineas del TXT al DBF
dbclosearea()
.---------
Con esto has creado un DBF con un campo TEXTO que contiene todas las lineas de Fichero.TXT.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Caracter enter

Publicado por MR (6 intervenciones) el 24/02/2009 12:32:53
Esa opción ya la había probado y no funciona porque me agrega la línea de texto hasta el primer enter y luego corta la misma . Es decir, toma como separador el enter pero me descarta lo que le sigue y pone luego el registro que sigue que lo obtiene del próximo fin de linea que encuentra:
1H|^&|||2090007|||||||P|6146010-10-02 (descarta el resto de la linea)
2|6|^^^6|NORM||||| (esta seria el 2° registro de la tabla)
Voy a seguir pensando porque no hay caso ...no le encuentro la vuelta...Gracias por contestar !!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Caracter enter

Publicado por antonio (216 intervenciones) el 24/02/2009 10:08:40
PRUEBA CON EL CHR(13)
SALUDOS
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Caracter enter

Publicado por MR (6 intervenciones) el 24/02/2009 13:01:10
SI probé antonio pero no funciona. Cuando intento ponerlo en una tabla, me lo separa con el primer enter y luego me descarte el resto de la linea..con lo que pierdo datos...
Gracias igual !!! Le seguiré buscando la vuelta....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Caracter enter

Publicado por jose (2 intervenciones) el 24/02/2009 13:01:17
bueno...., a ver esta otra, la uso porque en xHarbour no funciona APPED FROM,

Lee un fichero.txt y lo carga en la dbf activa.
Func Appfrom(cFile)
Local n, nFs, nSiz, nFld, ctxt
LOCAL cBuf, nLng:=512, nLee, nlk, npos:=0
Local OldFormat:=Set( 4, "dd-mm-yyyy" )
PRIVATE aNmb
// aNmb[1,1]=Nombre,aNmb[1,2]=tipo,aNmb[1,3]=Len,aNmb[1,4]=nDec
aNmb:=DBSTRUCT()
nFld:=FCOUNT() // Num. de campos en la dbf
nSiz:=RECSIZE()
nFs:=FOPEN(cFile)
if nFs < 1
Alert("FICHERO NO EXISTE"+CFILE)
Return nil
endif
// se lee el fic txt
Do While .T.
cBuf:=SPACE(nLng)
nLee:= FREAD(nFs,@cBuf,nLng)
if nLee < 2 // con nLee = 1, es Eof, CHR(26)
EXIT
endif
nlk:=AT(CHR(10), cBuf)
if nlk == 0
cTxt += cBuf // la long del registro (dbf) > 512
else
ctxt := SUBST(cBuf, 1, nlk-2) // quitar CRLF
CargaFdDbf(ctxt, nFld)
npos += nlk
FSEEK(nFs, npos, 0) // situa el puntero en el siguiente reg.
ctxt:=""
endif
enddo
if (!EMPTY(ctxt), CargaFdDbf(ctxt, nFld), ) // Graba el final
FCLOSE(nFs)
Set(4, oldFormat) // Restaura el formato de fecha
RETURN nil

Static FUNC CargaFdDbf(ctxt, nFld)
Local nfd
ctxt += if(Len(ctxt) < RECSIZE(), REPLICATE(" ",RECSIZE()-len(ctxt)), "")
DBAPPEND()
n:=1
FOR i:=1 TO nFld // Recorre todos los campos
// necesito saber la long de cada campo en 'nfd'
nfd:=aNmb[i,3]
cValor:=SUBST(ctxt, n, nfd) // transformar cValor
cValor:= cChartoVal(cValor, aNmb[i,2], aNmb[i,4])
FIELDPUT(i, cValor)
n += nfd
NEXT
RETURN nil

Static FUNC cChartoVal(cValor, cType, ndec)
local uResult, cFecha
do case
case cType == "C"
uResult = cValor
case cType == "N"
// uResult = Val( cValor ) / 10**ndec // 10**2=100, 10**0=1
uResult = Val( cValor )
case cType == "D"
cFecha:= SUBST(cValor,7,2)+"-"+ SUBST(cValor,5,2)+"-"+SUBST(cValor,1,4)
uResult = CToD( cFecha )
// uResult = SToD( cFecha )
case cType == "L"
uResult = ( cValor == "T" )
endcase
return uResult
//---- puedes depurar lo que no te interese
Suuerte.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Caracter enter

Publicado por MR (6 intervenciones) el 24/02/2009 14:45:50
Muchas gracias José !!!...lo voy a analizar y probar a ver que pasa....
Despues te cuento....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Caracter enter

Publicado por MR (6 intervenciones) el 19/03/2009 15:39:59
Mil gracias José !!! utilicé tu solución que me ha servido de mucho...pude resolver el tema leyendo el archivo como me indicaste a bajo nivel....GRACIAS !!!
Este foro es excelente..siempre que tengo alguna duda me ayuda leer los comentarios ...en general no pregunto porque encuentro antes algo que me sirva...
ME SALVASTE JOSE !!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Caracter enter

Publicado por MR (6 intervenciones) el 21/04/2009 16:43:27
José: MUCHAS GRACIAS!!!! ya solucioné el tema y lo hice siguiendo tu última sugerencia la de leer el archivo renglón a renglón..y todo sin problemas!!!
Mil Gracias!!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar