Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Gb.util.CsvFile
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Gb.util.CsvFile 
 
Hola amigos, entre los componentes de gambas existe uno gb.util que incluye una clase, CsvFile que yo uso para la lectura de ficheros csv. Funciona de miedo sobre todo para mi programa que lee lecturas de contador de electricidad (CUPS, potencia,  consumo de activa, reactiva, etc) y son un montón.
El caso es que lo he querido usar para escribir mis propios ficheros y como tiene un método .Create lo he intentado usar, no obstante me dice la ayuda que este funciona a partir de la version 3.15 y que casualidad que tengo la 3.14.3
Instalé desde los repositorios gambas-team/gambas3 y la última versión como se ve en la screenshot es esa.
Para cuando se podrá actualizar?  Alguien sabe?
Mi alternativa es crearme un módulo que inicie un fichero con las cabeceras que yo le diga y grabe un String[] con los datos para cada línea, pero esperaba ahorrármelo.

 ppagambas

Gracias
 



 
ahtonio - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Gb.util.CsvFile 
 
Hola ahtonio:

Alternativa:
Puedes "bichear" la clase  CsvFile, dentro del ficheo gb.util de la version 3.15, copiar su código  y crear en tu proyecto  una nueva clase "CsvFIleLaMia" y usarla en tu proyecto.  Es posible que funcione.

Saludos

Julio
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Gb.util.CsvFile 
 
Hola Antonio, mira te dejo un método que uso yo para leer y escribir CSV
Antes de nada, que sepas que con File.load(archivo.csv) ya cargas el contenido de un archivo de texto en una variable de tipo texto. Dicho esto este método que uso hace una lista de los renglónes de un archivo y devuelve una matriz de texto.
Public Function FileLoad(strPath As String, Optional bolBL As Boolean) As String[] ''Devuelve una matriz de texto donde cada ítem es un renglón del archivo de texto. Si el renglón esta vacio en el archivo de texto, es decir se trata de unallinea vacia, esta no se pasa a la martiz, por lo tanto el resultado es un retorno sin lineas en blanco.
  
  Dim strList As String
  Dim stxListTmp As New String[]
  Dim stxList As New String[]
  Dim intList As Integer
  
  stxList.Clear
  
  If Exist(strPath) Then
    
    strList = File.Load(strPath)
    
    If InStr(strList, "\n") > -1 Then
      stxListTmp = Split(strList, "\n")
    Else
      If String.Len(strList) > 0 Then
        stxListTmp.Add(strList)
      Endif
    Endif
    
    For intList = 0 To stxListTmp.Max
      Select bolBL
        Case False
          If stxListTmp[intList] <> "" Then
            stxList.Add(stxListTmp[intList])
          Endif
        Case Else
          stxList.Add(stxListTmp[intList])
      End Select
    Next
  Endif
  
  Return stxList
  
End
 

Luego recorres esta variable usando split() para separar según sea el caso de comas, tabuladores espacios etc.
Bien ya tienes la lectura .
La escritura de un CSV se hace, partiendo de una matriz de texto.
File.Save("/ruta/archivo.csv", data.Join(","))
 

Listo eso es todo, no es necesario gambas 3.15 para operar con CSV
Espero te sea de utilidad
Saludos.
 



 
tincho - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Gb.util.CsvFile 
 
Muchisimas gracias.

Muy interesante el planteamiento Tincho.

Como quiero implementar con la misma clase cuando salga la versión 3.15, me he "fabricado" un módulo (no una clase propiamente dicha) que hace lo que hará el método create y que cuando abro un fichero para escritura, ya carga los campos (la primera línea).
Lo dejo aquí por si alguien puede interesarle.

' gambas module file

'
' Modulo diseñado para crear y grabar líneas a un fichero csv
' hasta que en la versión gb.util.csvFile 3.15 habilite el metodo
' Create y Write
'

Private fields As String[]    ' Nombres de los campos (Heading)
Private fichero As File       ' Fichero csv que se abrirá
Private separador As String


Public Sub create(hfile As String, sfields As String[], Optional sep As String = ";")

  Dim ok As Integer
  Dim i As Integer = 0
  Dim linea As String

  ' Por defecto si no se cambia los campos los separamos por ;
  separador = sep
  
  If Exist(hfile) Then
    ok = Message.Warning("El fichero " & hfile & " ya existe\nDesea reemplazarlo?", "Si", "No")

    If ok = 2 Then Return ' Cancela la operacion
  Endif
  
  ' Si llega aquí no existe el fichero o lo queremos reemplazar
  
  Try fichero = Open hfile For Create
  If Error Then
    Message.Error("Al crear el fichero " & hfile & "\nse ha producido el ERROR\n " & Error.Text)
    Return
  Endif
  
  ' El fichero existe y está abierto para escritura
  ' grabamos cabeceras con los campos recibidos
  fields = sfields
  For i = 0 To fields.Max
    linea &= LCase(fields[i])

    If i < fields.Count - 1 Then
      linea &= separador
    Endif

  Next
  ' Construida la linea, la escribimos
  Print #fichero, linea
  ' Lo dejamos abierto porque
  ' entiendo que se ha creado para escribir en él
  Return
  
End

Public Sub Open(hfile As String, Optional sep As String = ";")
  
  Dim ok As Integer
  Dim linea As String
  
  ' El fichero debe de existir
  separador = sep
  If Not Exist(hfile) Then
    ok = Message.Error("El fichero " & hfile & "\nno existe. Debe de usar el método create")
    Return
  Endif
  ' El fichero existe
  ' Vamos a leer la cabecera de los campos
  fichero = Open hfile For Input
  Line Input #fichero, linea
  fields = Split(linea, ";")
  ' Rescatados los campos cerramos y abrimos para añadir lineas
  fichero.Close
  fichero = Open hfile For Append
  
End

Public Sub Write(regs As String[])
  
  Dim campo As String
  Dim linea As String
  Dim i As Integer = 0
  
  For i = 0 To regs.Max
    linea &= regs[i]
    If i < regs.Max Then
      linea &= separador
    Endif
  Next
  Print #fichero, linea
  
End


Public Sub Close()
  ' Siempre cerrar el fichero despues de usar
  fichero.Close
  
End

Public Function getFields() As String[]
  ' Recuperar los campos que usa el fichero csv
  Return fields
  
End


Como verás no compruebo que el string[] que recibe el metodo write sea correcto porque es para uso interno y debería saber que mando, no obstante se puede mejorar.
Para salir del paso me ha servido.

Muchas gracias
 



 
última edición por ahtonio el Domingo, 05 Abril 2020, 20:46; editado 1 vez 
ahtonio - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
Ocultar¡Este tema fue útil?

 

Elegir valoración:                       

Media de valoración Valoración mínima Valoración máxima Número de valoraciones
0.00 0 0 0
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
No puede descargar archivos
No puede publicar eventos en el calendario