https://foro.gambas-es.org/viewtopic.php?f=4&t=7940&p=47798#p47798
-----------------------------------
ahtonio
Domingo, 05 Abril 2020, 19:43

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.

[code linenumbers=false syntax=gambas]
' 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[/code]

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


