Páginas (2): 1 2   
Harpo   04-04-2024, 20:41
#1
Saludos,

Necesito poder abrir y leer ficheros DBF. Si, esos en los que están pensando.
Estuve buscando un driver ODBC para xBase pero lo que hay es comercial y con periodo de prueba limitado, así que estoy creando mi propio "driver" para DBF en Gambas.

El caso es que necesito transformar Byte[] a integer, short, long, y no he visto una función en Gambas que lo haga.
Me he hecho una propia, pero entiendo que algo interno de Gambas sería más rápido. Y el rendimiento es importante.

Este es el primer borrador, si alguien tiene alguna sugerencia es bienvenida.
Código:
Private Function ByteToNumber(aDigits As Byte[]) As Long

   Dim iValue As Long = 0
   Dim iDigit As Short

   iValue = aDigits[0]
   For iDigit = 1 To aDigits.Max
      iValue += aDigits[iDigit] * (256 ^ iDigit)
   Next
   Return iValue

End

Saludos, Harpo.
Shordi   04-04-2024, 22:09
#2
Pues ni idea, oiga. Aún así me parece un hermoso berenjenal ese en el que te estas metiendo. Si lo llegas a conseguir compártelo, plis, que aún conservo unos dbf de los 90 de las aplicaciones que hacía entonces para Clipper 5 y me encantaría poder manejarlos desde Gambas.

Saludos

No podemos regresar
vuott   04-04-2024, 23:03
#3
No sé si esta página de la wiki italiana puede ayudarte:

https://www.gambas-it.org/wiki/index.php...re_al_Byte

« Los horizontes perdidos nunca regresan. » (F. Battiato, 1983)

« Las ondas nunca regresan. » (Genesis: Ripples, 1976)

« Vita non suavis esse potest, nec Mors amara. »  (...vuott)
Harpo   05-04-2024, 11:37
#4
Gracias Vuott, un información muy interesante. El uso de un puntero a Byte[].Data es una solución sencilla y elegante. Había buscado en el foro italiano pero no en la Wiki.

Shordi, cuando lo tenga más avanzado lo subo. En principio mi necesidad es poder leer DBF, y la estructura no es compleja para versiones de fichero Clipper o dBaseIII. Ya tengo solucionada la parte de cargar la cabecera del fichero y su estructura, que está en formato binario. La parte de cargar y manejar los datos todavía no la tengo decidida, barajo varias opciones.

Un saludo, Harpo.
jguardon   07-04-2024, 22:49
#5
Puede que no tengas que reinventar la rueda, después de una sencilla búsqueda he encontrado esto:

http://sdteffen.de/gtkdbfeditor/

https://github.com/rollinhand/dbf-core

https://linux.die.net/man/1/dbview -> (https://pkgs.org/download/dbview)

Puede que alguno te sirva y te ahorras un dolor de cabeza...

Saludos

Por favor, usa el corrector ortográfico antes de pulsar el botón 'Enviar'
Shordi   08-04-2024, 11:13
#6
En los repositorios de manjaro existe algo llamado python-dbfread que por lo visto devuelve el dbf legible para python y desde ahí es posible pasarlo a .csv o similar.

Como yo de la serpiente na de na, pues no digo más.

Saludos.

No podemos regresar
Harpo   08-04-2024, 17:40
#7
Muchas gracias a los dos por la información, ya había explorado esas posibilidades antes de lanzarme al barro.

Sigo con ello, ya tengo un primera versión capaz de extraer los datos de un DBF usando solo Gambas.
Ahora estoy con el problema de pasar bytes con caracteres en Ascii extendido a algo legible.

El problema es este:
Código:
Public Sub Cadena()

   Dim aByte As Byte[]
   Dim sString As String

   aByte = [65, 78, 65, 32, 80, 144, 82, 69, 90]      'ANA PÉREZ

   sString = aByte.ToString()   
   Debug sString   'ANA P REZ

End

Un saludo, Harpo
Shordi   08-04-2024, 18:31
#8
Considera éste código:
Código:
  Dim aByte As Byte[]
  Dim sString, codifs, sCodif As String
  Dim n As Integer
  Dim apages, aLineas As New String[]

  aByte = [65, 78, 65, 32, 80, 144, 82, 69, 90]      'ANA PÉREZ

  'Extraemos las páginas de códigos que soporta el sistema a un string[] aPages
  Exec ["iconv", "-l"] To codifs
  apages = Split(codifs, " /\n,", "", True)

  'las testeamos todas
  For Each sString In apages
    Try sCodif = Conv(aByte.ToString(), sString, "UTF-8")
    If InStr(sCodif, "ANA PÉREZ") > 0 Then 'Guardamos las válidas en aLineas
      aLineas.Add(sString)
    Endif
  Next
  For Each sString In aLineas
    Print sString   'las imprimimos
  Next

Te da un listado enorme de todas las páginas que convierten bien esa cadena en tu sistema. En el mío el resultado es:
437
850
852
857
858
860
861
863
865
CP-HU
CP437
CP773
CP774
CP775
CP803
CP850
CP852
CP857
CP858
CP860
CP861
CP863
CP865
CPIBM861
CSA7-1
CSA7-2
CSASCII
CSIBM857
CSIBM860
CSIBM863
CSIBM865
CSPC8CODEPAGE437
CSPC775BALTIC
CSPC850MULTILINGUAL
CSPC858MULTILINGUAL
CSPCP852
CWI-2
CWI
IBM437
IBM775
IBM803
IBM850
IBM852
IBM857
IBM858
IBM860
IBM861
IBM863
IBM865
OSF100201B5
OSF1002035D
OSF1002035F
OSF10020352
OSF10020354

Son un montón, pero dado que los dbf son de cuando MS-DOS en su mayoría, imagino que la página correcta es la 850 o la IBM850 (que imagino que son sinónimas)

Así, tu problema se soluciona con la función Conv

Código:
      'ANA PÉREZ
sCodif = Conv(aByte.ToString(), "IBM850", "UTF-8")

Saludos

Más sencillo, quizá, es averiguar cual es la página de códigos del fichero usando el comando file

File -bi <mi-fichero de texto>

que te responde algo así:text/plain; charset=utf-8
y convertirlo de una con

 
Código:
Dim cpage, mifichero, ficheroconvertido As String

  mifichero = "path al fichero sin convertir"
  ficheroConvertido = "path al fichero convertido"
 
  Exec ["File", "bi", mifichero] To cPage
  cPage = Split(cpage, "=", "", True).max
  File.Save(ficheroConvertido, Conv(File.Load(mifichero), cPage, "UTF-8"))
Última modificación: 08-04-2024, 18:49 por Shordi.

No podemos regresar
paskola   11-04-2024, 00:00
#9
Yo lei DBF y escuché tambores en la distancia. Que tiempos aquellos de compilar y salirte a fumar un cigarro en lo que Clipper hacía lo suyo. Es lo que tiene hacerse viejo.

Entiendo que mucho de este proyecto es por necesidad y otro tanto por el mero hecho de poder lograrlo, cosa que agradecemos todos los que esperamos aprender de tu proyecto. 

Yo enfrentado a tal dilema me hubiera ido por la opción fácil de importar los DBF a SQL directamente y desde alli acceder a ellos desde Gambas. Las versiones viejas de SQL Server te permite importarlos, no es trabajo limpio pero es posible.

Un saludo y sigo atento este hilo.
Shordi   11-04-2024, 11:27
#10
¡Hombre! Otro colega de los viejos tiempos del Clipper. Creía que era el único por estos lares... Yo comencé a programar en el mundo del PC con el viejo Clipper Summer'87 y de ahí al Clipper 5.1. Con él me labré mi posición en la empresa e hice algunas cosas que para la época eran auténticas maravillas...

Big Grin Big Grin

Bienvenido

No podemos regresar
Páginas (2): 1 2   
  
Usuarios navegando en este tema: 6 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.