Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: naderit - 06 Gennaio 2010, 12:33:47

Titolo: [risolto]read file
Inserito da: naderit - 06 Gennaio 2010, 12:33:47
salve a tutti, la mia domanda è semplice come posso leggere un file con metodo casuale?
grazie
Titolo: Re: read file
Inserito da: Berserker79 - 06 Gennaio 2010, 12:53:03
Che tipo di file (txt, video, audio, ecc.)???
Titolo: Re: read file
Inserito da: naderit - 06 Gennaio 2010, 15:23:26
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
Titolo: Re: read file
Inserito da: Ceskho - 06 Gennaio 2010, 16:03:22
Ma tu vuoi leggere un file a caso o un campo del file a caso?
Titolo: Re: read file
Inserito da: naderit - 06 Gennaio 2010, 16:41:54
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
Titolo: Re: read file
Inserito da: fsurfing - 06 Gennaio 2010, 23:52:40
scusa una domanda stupida da parte di un programmatore non professionista ed illetterato ma a che serve leggere un file in modo casuale?
Titolo: Re: read file
Inserito da: guglielmofede - 08 Gennaio 2010, 00:41:38
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....
Titolo: Re: read file
Inserito da: naderit - 08 Gennaio 2010, 09:41:27
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
Titolo: Re: read file
Inserito da: fsurfing - 08 Gennaio 2010, 11:26:56
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.
Titolo: Re: read file
Inserito da: leo72 - 08 Gennaio 2010, 15:43:43
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.
Titolo: Re: read file
Inserito da: Ceskho - 08 Gennaio 2010, 15:46:56
Ma scusate non è meglio dividere i "campi" con un carattere di tabulazione e poi splittarlo come \t???
Titolo: Re: read file
Inserito da: leo72 - 08 Gennaio 2010, 23:21:29
Beh, sì, certo. Come sempre non c'è mai la soluzione perfetta :-)
Dipende da lui come vuole accedere ai dati e cosa contengono quei dati.
Titolo: Re: read file
Inserito da: guglielmofede - 08 Gennaio 2010, 23:51:39
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 !
Titolo: Re: read file
Inserito da: Ceskho - 09 Gennaio 2010, 00:47:12
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...
Titolo: Re: read file
Inserito da: pastrank - 09 Gennaio 2010, 11:35:18
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.
Titolo: Re: read file
Inserito da: compnoprofit - 09 Gennaio 2010, 14:37:14
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
Titolo: Re: read file
Inserito da: leo72 - 09 Gennaio 2010, 23:29:23
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.
Titolo: Re: read file
Inserito da: compnoprofit - 10 Gennaio 2010, 10:58:23
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.
Titolo: Re: read file
Inserito da: fsurfing - 10 Gennaio 2010, 11:08:21
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 :)
Titolo: Re: read file
Inserito da: compnoprofit - 10 Gennaio 2010, 11:52:24
: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:
Titolo: [risolto]read file
Inserito da: naderit - 10 Gennaio 2010, 14:44:02
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
Titolo: Re: [risolto]read file
Inserito da: Ceskho - 10 Gennaio 2010, 15:42:06
Quando scrivi del codice non è necessario colorarlo ma esistono gli appositi tag code....