Gambas-it
Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: naderit - 06 Gennaio 2010, 12:33:47
-
salve a tutti, la mia domanda è semplice come posso leggere un file con metodo casuale?
grazie
-
Che tipo di file (txt, video, audio, ecc.)???
-
scusate
un file *.txt con una lunghezza per ogni record e campi ben stabilita
tipo :
aaaaaaaaaa bbbbbbbbbb
cccccccccc ffffffffff
wwwwwwwwww rrrrrrrrrr
con vb6 utilizzo questa procedura:
Option Explicit
Dim index As Integer
Private Type myrecord
campo1 As String * 15
campo2 As String * 10
End Type
Private Sub Command1_Click()
Dim intfile As Integer
Dim leggi As myrecord
If index = 0 Then
index = 1
End If
intfile = FreeFile
Open App.Path & "\miofile.txt" For Random As #intfile Len = 25
Get #intfile, index, leggi
Close #intfile
Label1.Caption = leggi.campo1
Label2.Caption = leggi.campo2
index = index + 1
End Sub
-
Ma tu vuoi leggere un file a caso o un campo del file a caso?
-
forse mi sono spiegato male:
casuale intendevo il metodo di lettura del file in vb:
IMPUT #miofile apre un file con metodo sequenziale
RANDOM #miofile apre un file con metodo casuale
BINARY #miofile apre un file con metodo binario
ho già visto il metodo sequenziale con gambas:
PUBLIC SUB Button1_Click()
DIM intfile AS File
DIM ntesto AS String
intfile = OPEN "/miofile.txt" FOR INPUT
WHILE NOT Eof(intfile)
LINE INPUT #intfile, ntesto
ListBox1.Add(ntesto)
WEND
CLOSE #intfile
END
questa procedura carica un file di testo in una listbox
mi serve solo per capire come funziona gambas per migrare alcune applicazioni
ciao
-
scusa una domanda stupida da parte di un programmatore non professionista ed illetterato ma a che serve leggere un file in modo casuale?
-
SALVE,
vedo che molti il Basic non l'ho anno praticato come altri.
naderit
in questo momento non ho ancora messo mano ai file, anche se ho letto, accenni, a come collegarsi al SQL3 e se è così semplice allora siamo veramente a cavallo.
Si perchè solo chi ha cozzato con le field sa cosa intendo.
Per dovere di cronache, vedo di spiegare cosa intente il N.S. amico naderit.
In Basic la possibbilità di spostarsi da un record all'altro e quindi di accedere in modo diretto al record viene identificato con la parola RANDOM cioè accesso casuale.
L'accesso ai file in Basic è Input , Output , Append , Random , Binary.
Con le estensioni dell'SQL queste non servono perchè è il database a gestire tutto, indici, campi, record.
Per esempio: le colonne in excel si possono paragonare ai campi, le rihe ai record.
Spero di aver fatto chiarezza....
-
grazie Guglielmofede
effettivamente non sono stato molto chiaro, vi spiego cosa devo fare:
ho un file di testo, tipo exel, come diceva gugleimofede, composto da righe e colonne sempre di una lunghessa per colonna ben stabilita, es. 30 caratteri; ora devo estrarre tutti i dati di ogni cella identificata con n°riga/n°colonna, lavorarli e salvarli in un database, un modo possibile è leggere il file con metodo RANDOM (casuale) in quanto posso per ogni riga, definire le colonne, in vb, come ho spiegato definisco un nuovo tipo di variabile con il metodo Type, ovvero:
Private Type myrecord
colonna1 As String * 15 - definendo il n° di caratteri da estrarre
colonna2 As String * 10
End Type
aprendo poi il file con RANDOM e popolando le variabili con GET
Ora non sono riuscito a trovare il metodo con Gambas
grazie
-
quindi il tuo file non ha dei caratteri per separare le colonne ma ogni colonna viene definita in base a un tot numero di caratteri?
il metodo per estrarre i dati da questo tipo di file è molto semplice e veloce, se invece le colonne sono anche separate da un carattere è ancora più semplice e ti puoi guardare il codice di meteomachinelinux nel fom di importazione dati da file di testo.
-
I field, se non ricordo male, c'erano già nel vecchio GW-BASIC, dove si poteva aprire l'n-simo record di un file di tipo Random. Random significava appunto ad accesso casuale, perché non eri costretto a leggerti tutti i dati prima di quelli da te voluti.
In pratica era un "layer" che creava l'interprete fra il file e l'utente.
L'utente non doveva far altro che definire la lunghezza dei campi del record e poi era il sistema. Immaginiamo che creassi questa struttura:
Nome: 30
Cognome: 40
Indirizzo: 80
Ogni record era lungo 150 caratteri.
Se io volevo leggere il 3° record, chiedevo semplicemente di farlo: era poi l'interprete che apriva il file in questione, "saltava" i primi 300 caratteri e poi leggeva dal 301° al 450° e mi forniva i dati già suddivisi per campi.
In Gambas si potrebbe fare semplicemente con un file su cui si memorizzano i dati riga per riga. Ogni riga è costituita da una stringa unica. Si programma il sistema affinché sappia che tale stringa contiene: da un certo punto ad un altro una variabile, da quel punto ad un altro ancora un altro campo ecc...
Basta poi aprire il file, saltare le prime n-1 righe, leggere la riga n e dividere i dati n base allo schema richiesto.
-
Ma scusate non è meglio dividere i "campi" con un carattere di tabulazione e poi splittarlo come \t???
-
Beh, sì, certo. Come sempre non c'è mai la soluzione perfetta :-)
Dipende da lui come vuole accedere ai dati e cosa contengono quei dati.
-
SALVE,
e se i dati vi sono stati dati cosi ?
Mi pare di avere capito che i file sono quelli che l'excel compone per trasportare i dati ad altre applicazioni, cioè i file con estensione cvs.
Io non so rispondere perchè devo ancora studiare.... dai, su, qualche anima buona ? Non vorrete perdere questo N.S. amico facendolo ritornare dall'altra sponda.
Ormai ha spiccato il primo salto, diamogli un tetto !
-
Purtroppo nessuno di noi è sensitivo...se non ci vengono dati tutti i dati necessari non possiamo sapere cosa serva veramente all'utente. Noi cerchiamo di dare UNA soluzione e mai LA soluzione..
Diamo le risposte in base alle esigenze e alle nostre conoscenze. Se non sappiamo con quali materiali abbiamo a che fare possiamo stare qui a indovinare a vita...
-
E' poco che uso Gamnas, e questo ancora non l'ho mai dovuto usare, ma, guardando la documentazione, direi che deve usare gli Stream... tenere i record di lunghezza fissa puo' essere fatto leggendo sequenzialmente il file e scartando le righe "inutili", ma in caso di file belli grossi e' un lavoro lungo. Se sono poche righe, invece, e' inutile.
Invece, con quel metodo si leggono solo i caratteri necessari, ed e' sicuramente molto piu' veloce. Usavo questo metodo spesso con vb, dove altrimenti tenere gia' due o tre mega di archivio diventava lento. Si puo' associare un indice in memoria ai vari record, per maggiore velocita'.
Un esempio di questo sistema, per esempio, e' nella documentazione, su READ. In pratica si imposta il carattere di partenza, e si leggono tot caratteri successivi. E' chiaro poi che una semplice classe ti permettera', una volta creata, di leggere il record N astraendosi dalle "complessita'" della lettura.
Dico questo perche' in molti casi questo evita l'uso di database, quindi meno dipendenze, quindi e' piu' sicuro: imho, come nel vb, dove di solito un programma con piu' di due ocx quasi mai valeva i dischetti su cui era salvato.
-
Anche a me servirebbe fare con Gambas quello che facevo con QBasic per Dos: aprire un file di testo con accesso casuale o binario, ció permette ad esempio di leggere o modificare solo il record nº12 conoscendo la lunghezza totale del file e la lunghezza del record (che è fissa per tutti i records).
Come ha detto Pastrano credo che si possa fare utilizzando l'approccio del file binario con le istruzioni READ e WRITE.
Esistono altri metodi per modificare una riga di un file di testo senza dover riscrivere l'intero file? se si sarei interessato a conoscerli
-
Preciso una cosa.
Premesso che in campo informatico è possibile fare quasi tutto, io però eviterei di utilizzare file per memorizzare grosse moli di dati. Esistono i DB apposta, e mi pare un grosso dispendio di neuroni e di potenza elaborativa il volersi arrovellare il cervello per trovare soluzioni posticce.
Secondo me l'approccio più "pulito" è quello di costruire un algoritmo di importazione ed inserire i dati del file in un DB, per una manipolazione più rapida e veloce.
Accedere ai file con i metodi che venivano usati col DOS mi pare anacronistico: il DOS andava bene 20 anni fa, ora ci sono strumenti più potenti. Usiamoli.
-
Sono d'accordo con Leo72, mysql e sqlite sono lí per quello, peró non dimentichiamo che i files di testo saranno utilizzati sempre per alcune operazioni, ad esempio: un file di configurazione nascosto dove salviamo i dati per il login al database, un file per condividere dati fra programmi che usano formati e database diversi (in ingegneria quasi tutti i programmi hanno uscite in .csv .txt .pwe). In questi casi sarebbe piú snello e pulito a livello di codice l'accesso random o binario rispetto all'approccio di tipo sequenziale.
-
per i file di configurazione esiste "settings" per tutto il resto solitamente i file di testo utilizzati sono molto leggeri.
poi ognuno scrive il codice che gli pare :)
-
:evviva: ecco adesso mi avete davvero salvato, ignoravo gb.setting, grazie fsurfing. Il programma di computo metrico a cui sto lavorando non lo utilizzava.
Le dimensioni dei files di scambio in edilizia possono essere grandi perché c'è un file di testo .pwe molto utilizzato dove si riversa la contabilitá di un'opera, peró oggi esiste una versione piú moderna basata su xml, suppongo che si possa prescindere del pwe.
Grazie ai moderatori :ciao:
-
bene, la soluzione era più semplice del previsto:
PUBLIC SUB Button1_Click()
'dichiaro le variabili
DIM intfile AS File
DIM campo1 AS String
DIM campo2 AS String
DIM campo3 AS String
'utilizzo il metodo binario con READ per popolare le variabili
intfile = OPEN "/percorso/miofile.txt" FOR READ
READ #intfile, campo1, 48 'memorizzo i primi 48 caratteri
READ #intfile, campo2, 22 'memorizzo i seguenti 22 caratteri della stessa riga
READ #intfile, campo3, 21
label1.Caption = campo1 'visualizzo in label
Label2.Caption = campo2
Label3.Caption = campo3
CLOSE #intfile
END
grazie per alcune dritte
a presto
-
Quando scrivi del codice non è necessario colorarlo ma esistono gli appositi tag code....