Anzi tutto un saluto a tutti, vi leggo piu' di quel che scrivo. Mi scuso pure per il titolo deviante.
In un modulo, ho dichiarato una struttura, e c'e' una funzione generica che mi prende i valori da una base dati e me li restituisce come array di questa struttura. Cerco di semplificare il codice
Public Struct MyStruct
nome As String
info As String
End Struct
La funzione e' una cosa tipo questa:
function Generale(basedati as string) as Mystruct[]
dim MioArray as Mystruct[]
' qui mi lavoro basedati, e ritorno un array di questa struttura
return MioArray
end function
Essendoci nell'array piu' item e ognuno con il suo motivo, quasi mai da usare insieme, vorrei leggere una parte del valore alla volta, con altre funzioni: potrebbe essere fatto tutto in una, ma a spese della leggibilita'.
Public Function Parziale(base as string, cosaleggere as string) as string
dim dati as MyStruct[]
dim s as string = ""
dati = Generale(base)
For i = 0 To dati.count - 1
s &= dati[i].nome
Next
return s
end function
E qui cade l'asino (cioe' io), che non ho piu' la memoria di una volta. Supponendo che io voglia leggere, in tutti, il valore dati.nome, vorrei pero' chiamare la funzione Parziale() in modo da essere usabile genericamente, passando in "cosaleggere" sia "nome" che "info". Ma come scrivo la cosa? In questi modi no, certo
Certo che sia una banalita' (non ho piu' l'allenamento con Gambas come una volta, che poi non era chissa' cosa), vi saluto per ora. Anche se cose nuove ho ben poco tempo per farle, comunque, uso ancora molto Gambas, piu' che altro come interfaccia, ma e' sempre godibile.
mi (https://www.gambas-club.de/images/smilies/icon_confused.gif) "pare" di aver capito che nell'argomento "cosaleggere" vi sia una stringa contenente due parole che intendono rappresentare un "nome" e una "informazione".
Aspetta, forse l'ho spiegata male. Il dato che mi arriva e' un array, formato da item con questa struttura. La struttura, diciamo (e' un piu' complicata, diciamo saranno una 15ina di possibili membri), ha i membri nome e info. Io ne rileggerei uno alla volta. Per questo vorrei passare alla funzione il nome di uno di questi, e poi enumerare tutti gli item. Ma se in questo modo me li legge
io vorrei passare, nel parametro cosaleggere, il nome da rileggere. Se io volessi leggere info, per esempio, vorrei richiamare la funzione come
risultato = Parziale(dati, "info")
pero' poi non e' che possa scrivere
print dati[i].[cosaleggere]
In altre parole, sicuramente si fara', ma non riesco a ritrovare la sintassi. Il perche' di tutta questa confusione: leggo un file in formato CSV, dove le intestazioni che mi interessano non sono tutte, e non sempre ci sono o sono nello stesso ordine: se io voglio leggere quelle che corrispondono all'intestazione info, per esempio, chiamo dalla funzione Parziale la procedura Generale, leggo il file, associo i numeri delle intestazioni a quelle delle "colonne", e ritorno tutto ordinato, e solo dopo leggerei una parte. Esisterebbero altri modi di arrivare a questa cosa, ma, per diversi motivi, sono ancora piu' lunghi e complicati.
:ciao:
Probabilmente non ho capito e non sarebbe certo una novità, ma se non erro, la Funzione Parziale con:
For i = 0 To dati.count - 1
s &= dati[i].nome
Next
restituisce tutti i nomi della struttura, forse prima dovresti individuare l'indice della struttura e solo successivamente passare alla funzione che cicla solo le cose da leggere.
Oltre al suggerimento di vuott, considererei l'uso, visto che prendi i dati da un file CSV, anche un database semplice e leggero come SQLite
Mi è venuto in mente anche questo, scusa le ingenuità ma siamo nel 2018:
https://www.gambas-it.org/smf/index.php?topic=6369.msg43941#msg43941
Ammesso e non concesso che quanto allegato possa servire da base di partenza, cosa dovresti leggere?
Signori e signore, saro' breve :-)
Prima di tutto, appena posso vedo anche come applicare questa cosa anche come struttura, grazie. Vediamo quali erano le mie intenzioni: come dicevo tempo fa, sto costruendo/modificando da decenni un'applicazione per gestirmi i miei file multimediali. Delle cose si fanno meglio con Gambas direttamente, altre sarebbero piu' semplici e veloci usando librerie e programmi.
Per le tag, ad esempio, un'applicazione che legge tutti i file (inclusi .dsf e .dxd, i bluray) e' kid3 (potrei dire perche' proprio questo, ma c'entra poco con questo topic). E' interfacciabile tramite shell o tramite dbus. Non e' che la velocita' cambi poi tanto, o meglio, in entrambi i casi e' piuttosto veloce. Ammetto di aver usato anche l'esempio di vuott su taglib ora sulla Wiki, che funzionava benissimo a patto di dichiarare la libreria come "libtag_c", volendo usare pero' altri tag custom non ho trovato che pochissimi esempi. Anche su Dbus non ho trovato molto, ho provato perfino due o tre AI, che in queste cose possono agire come comici.
Comunque, kid3 a linea di comando puo' richiamare un file qml (modificabile e allegato con il programma), e ottenere un file csv con le tag, in un tempo piuttosto breve: la mia idea era di leggere comunque le tag di tutto, pero' a volte le colonne hanno titoli, presenza o meno, e ordine diversi. Provando con gli array, cosa ho fatto (semplifico):
Ho dichiarato delle costanti, con l'idea di associare poi il nome all'array
Private Const fname As Integer = 0
Private Const title As Integer = 1
Private Const track As Integer = 2
...
e poi una struttura :-), che mi servira' per salvare la posizione dei vari campi del file successivamente
Public Struct TagMap
artist As Integer
fname As Integer
xinfo As Integer
......
End Struct
Letto il file csv, la prima riga e' quella dei nomi, e quindi la splitto (ha un comodo tab per divisore)
filetags = Split(filerows[0], "\t")
Devo quindi vedere cosa c'e': in pratica associo la posizione al campo
For i = 0 To filetags.count - 1
Select Case LCase(filetags[i])
Case "file path"
MyTag[fname] = i
Case "track number"
MyTag[track] = i
........
Questo sulla prima riga del file csv: le restanti sono le righe con i tag
For i = 1 To filerows.Count - 1
filetags = Split(filerows[i], "\t")
arrcount += 1
arr.add(arrItem) 'è un array a lunghezza fissa
arr[arrcount][fname] = filetags[MyTag[fname]]
A questo punto, ho un array a cui basta controllare se arr[fname] e' uguale al nome del file cercato, e poi prendere i valori (es arr[xinfo])