https://foro.gambas-es.org/viewtopic.php?f=4&t=7940
-----------------------------------
ahtonio
Viernes, 03 Abril 2020, 12:20

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. 

 [img]https://foro.gambas-es.org/files/images/190/ppagambas.png[/img] 

Gracias


-----------------------------------
jsbsan
Viernes, 03 Abril 2020, 16:35

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


-----------------------------------
tincho
Viernes, 03 Abril 2020, 17:23

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.
[code linenumbers=false syntax=gambas]
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
[/code]
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.
[code linenumbers=false syntax=gambas]
File.Save("/ruta/archivo.csv", data.Join(","))
[/code]
Listo eso es todo, no es necesario gambas 3.15 para operar con CSV
Espero te sea de utilidad
Saludos.


-----------------------------------
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


