Autore Topic: Importare dati da un file di testo e popolare un array a 2 dimensioni  (Letto 213 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.302
  • Ne mors quidem nos iunget
    • Mostra profilo
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Re:Importare dati da un file di testo e popolare un array a 2 dimensioni
« Risposta #1 il: 01 Settembre 2021, 11:16:18 »
Se io creo un file di testo con le caratteristiche comunicate da Roberto ottengo un file di 1,5 MB.
Se cerco di leggerlo Gambas si ferma alla ventesima tupla.
Era successo ieri con un mio modo e succede anche con il metodo Jussi

Forse sbaglio a creare il file magari ho frainteso, l'ho creato così:

Codice: [Seleziona]
Private Sub creoFile()
 
  Dim sPath As String = User.Home &/ "MyField.txt"
  Dim s As String = "["
 
  For r As Integer = 0 To 6000
    s &= "{"
    For c As Integer = 0 To 19
      If c = 19 Then
        s &= "Campo " & CStr(r + 1) & c
      Else
        s &= "Campo " & CStr(r + 1) & c & ","
      Endif
    Next
    If r = 6000 Then
      s &= "}}"
    Else
      s &= "}},"
    Endif
  Next
  s &= "]"
  File.Save(sPath, s)
 
End
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Re:Importare dati da un file di testo e popolare un array a 2 dimensioni
« Risposta #2 il: 01 Settembre 2021, 11:37:17 »
Ho capito dove era l'errore, io usavo per le righe:
Codice: [Seleziona]
For r As Integer = 0 To dd[0].Max
che ritorna 19 e non 6000 come erroneamente pensavo *
Se uso questo codice funziona:

Codice: [Seleziona]
Public Sub Main()

  Dim sData As String = Trim(File.Load("/home/gian/MyField.txt"))
  Dim dd As String[][]
 
  dd = ParseData(sData)
  For r As Integer = 0 To dd.Max
    For c As Integer = 0 To dd[0].Max
      Print dd[r][c];;
    Next
    Print
  Next
  Print "ROWS "; dd.Max '' è corretto !!!
End

* P.S. Pertanto il bug era solo nei miei pensieri errati, pensare troppo a volte fa male  ;D
dd[0].Max non può che restituire le colonne o se preferite il numero dei dati presenti in quella particolare posizione dell'array di array.
Naturalmente il tutto funziona se ogni array all'interno dell'array ha un numero identico di dati.
« Ultima modifica: 01 Settembre 2021, 14:26:01 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.302
  • Ne mors quidem nos iunget
    • Mostra profilo
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Re:Importare dati da un file di testo e popolare un array a 2 dimensioni
« Risposta #4 il: 01 Settembre 2021, 17:08:36 »
La confusione nei miei pensieri è scaturita probabilmente dal fatto che stavo provando un altro approccio rispetto al solito Split.

Cercavo un modo per far digerire a un array 2D una stringa.  ;D

Cerco di spiegarmi, il problema qui era: Ho un file di testo che contiene una stringa del genere:

[{Campo 10,Campo 11,Campo 12,Campo 13}},{Campo 20,Campo 21,Campo 22,Campo 23}},{Campo 30,Campo 31,Campo 32,Campo 33}},{Campo 40,Campo 41,Campo 42,Campo 43}},{Campo 50,Campo 51,Campo 52,Campo 53}},{Campo 60,Campo 61,Campo 62,Campo 63}},{Campo 70,Campo 71,Campo 72,Campo 73}}]

Visto che in Gambas si può creare un array in linea ( http://gambaswiki.org/wiki/lang/array?l=it ) volevo vedere se cambiando la stringa così:

[["Campo 10","Campo 11","Campo 12","Campo 13"],["Campo 20","Campo 21","Campo 22","Campo 23"],["Campo 30","Campo 31","Campo 32","Campo 33"],["Campo 40","Campo 41","Campo 42","Campo 43"],["Campo 50","Campo 51","Campo 52","Campo 53"],["Campo 60","Campo 61","Campo 62","Campo 63"],["Campo 70","Campo 71","Campo 72","Campo 73"]]

sarei poi riuscito a passarla ad un array 2D.

Per ottenere ciò, dato 's' come prima stringa, ho usato:
Codice: [Seleziona]
  s = Replace(s, "{", "[\"")
  s = Replace(s, ",C", "\",\"C")
  s = Replace(s, "}}", "\"]")
Val() è limitato e non adatto allo scopo, purtroppo i miei sforzi si sono infranti contro la mia ignoranza :-(

Col solo risultato di distrarmi sull'altro fronte...  :P
« Ultima modifica: 01 Settembre 2021, 17:09:55 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Re:Importare dati da un file di testo e popolare un array a 2 dimensioni
« Risposta #5 il: 01 Settembre 2021, 23:03:34 »
Mentre scrivevo mi è venuto in mente gb.eval, ma sono dovuto uscire.
Ora ho provato e sembra funzionare:
 
Codice: [Seleziona]
  dd = Eval(s)
  Print dd[3][3]

Restituisce 'Campo 43'

Notte  :ciao:

P.S. Ma è sconsigliato usarlo in quanto non sopporta oltre le 45 tuple (Espressione troppo complessa)
Niente male però...
« Ultima modifica: 01 Settembre 2021, 23:25:42 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro