Autore Topic: Leggere le Righe di Un file  (Letto 1750 volte)

Offline elia

  • Gamberetto
  • *
  • Post: 25
    • Mostra profilo
Leggere le Righe di Un file
« il: 13 Luglio 2015, 15:29:51 »
CIAO COMUNITÀ!
Scusate se faccio una nuova discussione, ma stavo facendo un altra cosa ed mi è venuto un dubbio.
Vorrei che in un programma, se io apro una file, mi legge le righe del file e per ogni riga faccia una funzione.
Es.
Se nella prima riga c'è scritto "Ciao" il programma mi deve rispondere "mondo."
COme posso fare?
GRAZIE IN ANTICIPO :)!

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 959
    • Mostra profilo
Re: Leggere le Righe di Un file
« Risposta #1 il: 13 Luglio 2015, 15:59:24 »
Il problema è che nel file ci deve essere un separatore che indica la fine della riga, altrimenti Gambas legge tutto il contenuto in una passata sola. Sapendo che codice ha il carattere non ci vuole granché ad implementare una funzione che legge e ritorna un risultato di conseguenza.
Bisogna vedere cosa  si è usato come carattere di separazione...
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Leggere le Righe di Un file
« Risposta #2 il: 13 Luglio 2015, 17:25:20 »
Il problema è che nel file ci deve essere un separatore che indica la fine della riga...
Seppur comprensibile la preoccupazione di Top Fuel, v'è però da dire che solitamente un file di testo (mi pare che elia stia facendo implicitamente riferimento ad un file di questo genere) contiene sempre caratteri non stampabili di fine riga (0x0A ...ovvero in Gambas: &0A).
Pertanto, elia potrà leggere ciascuna riga nelle modalità possibili per distinguere riga per riga.
Vedasi ad esempio qui le modalità 2, 7 e 8:
http://www.gambas-it.org/wiki/index.php?title=Leggere_un_file_di_testo

oppure la prima modalità avendo poi cura di distinguere ciascuna riga con la funzione Split(), oppure in modo adeguato con la delicata funzione Scan().
« 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 Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 959
    • Mostra profilo
Re: Leggere le Righe di Un file
« Risposta #3 il: 13 Luglio 2015, 18:58:33 »
Ma se guardi l'help di Gambas noterai che ci sono 3 diverse costanti di fine linea, gb.Unix, Chr$(10), gb.Windows, Chr$(13)+Chr$(10) e gb.Mac, Chr$(13), e ciò può complicare le cose.
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Leggere le Righe di Un file
« Risposta #4 il: 13 Luglio 2015, 22:59:08 »
Sì, ma mi pare dalle prove effettuate che il problema sorge solo con i file di testo salvati con codifica Mac.
In tal caso dovrà tenerne conto.
« 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 sotema

  • Maestro Gambero
  • ****
  • Post: 467
    • Mostra profilo
Re: Leggere le Righe di Un file
« Risposta #5 il: 14 Luglio 2015, 15:56:23 »
Il carattere di fine linea può essere impostato con la proprietà Stream.EndOfLine. di conseguenza la funzione Line Input troncherà la linea quando incontra tale sequenza.
Ti basta saper su quale SysOp è stato scritto il file, o eseguire un check sul delimitatore
L'uomo ha inventato la bomba atomica, ma nessun topo al mondo costruirebbe una trappola per topi.
Albert Einstein

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Leggere le Righe di Un file
« Risposta #6 il: 14 Luglio 2015, 16:14:12 »
Il carattere di fine linea può essere impostato con la proprietà Stream.EndOfLine.
Interessante questo suggerimento, sotema.
Non ho mai usato, sino ad ora questa proprietà: ed ora, volendala provre, non comprendo bene ancora come funziona.  :-\
Se creo un file di testo con due fine riga 0x0D (codifica MAC) e vado a leggere quanto mi restituisce quella proprietà, mi dà zero (costante gb.Unix)... che è il valore riferito al fine riga di Unix, cioè 0x0A.   :rolleyes:
« Ultima modifica: 14 Luglio 2015, 16:18:13 da vuott »
« 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 Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 959
    • Mostra profilo
Re: Leggere le Righe di Un file
« Risposta #7 il: 14 Luglio 2015, 21:25:27 »
Quella proprietà penso che vada settata prima di usare Line Input, magari, come dice Sotema, controllando il file subito dopo l'apertura.
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Leggere le Righe di Un file
« Risposta #8 il: 14 Luglio 2015, 22:35:57 »
Quella proprietà penso che vada settata prima di usare Line Input
Questo, suppongo, nel caso di scrittura di un file, ma non credo in caso di lettura di un file, poiché la guida dice che questa proprietà oltre a poter essere impostata, può, se interrogata, restituire anche una delle tre costanti da essa previste.


.... controllando il file subito dopo l'apertura.
...l'ho fatto, ma con un file contenente fine riga Chr(13) mi restituisce  :-\ un valore zero (ossia la costante gb.Unix), che corrisponde al fine riga standard Unix: \n .
« Ultima modifica: 14 Luglio 2015, 22:37:47 da vuott »
« 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 Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Leggere le Righe di Un file
« Risposta #9 il: 14 Luglio 2015, 22:50:58 »
Vorrei che in un programma, se io apro una file, mi legge le righe del file e per ogni riga faccia una funzione.

Non si capisce chi abbia scritto il file a cui ti riferisci. É un file .txt di Linux?
Se si, è buona norma che ciascuna  riga finisca sempre con una sequenza di escape. In Gambas, qualora la riga in registrazione non contenga un punto e virgola, né una virgola (\t(X09)) dopo l'ultima espressione, un end-of-line (\n(X0A)) verrà aggiunto automaticamente.

Alla luce di quanto indicato nella documentazione di Gambas, io registro i miei file sequenziali con la seguente modalità:
 
Codice: gambas [Seleziona]
hFile = Open $FlSeq For Output
 For i = 0 To iTotRec
    Print #hFile, campo[i, 0], campo[i, 1], campo3[i, 2], vTabMovvCanc[i, 3]
 Next
 Close #hFile


mentre in lettura uso:
Codice: gambas [Seleziona]

Dim hFile As File   ' File dei movimenti anomali già cancellati nelle giornate contabili di appartenenza
Dim hRec As String  ' Area di lettura dei record di hFile
Dim $FlSeq As String
Dim vTabRec As New Variant[]
'-----------------------------------------------------------------------------------------------------------------      
hFile = Open $FlSeq For Input
While Not Eof(hFile)
      Line Input #hFile, hRec
      vTabRec.Add(hRec)
Wend


Riesco a leggere una riga alla volta con la massima semplicità.  :D

« Ultima modifica: 14 Luglio 2015, 22:57:39 da Picavbg »
:ciao:

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 959
    • Mostra profilo
Re: Leggere le Righe di Un file
« Risposta #10 il: 14 Luglio 2015, 23:14:11 »
Ottimo, ma come la mettiamo con un file scritto da altri? :)
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Leggere le Righe di Un file
« Risposta #11 il: 15 Luglio 2015, 08:44:28 »
Ottimo, ma come la mettiamo con un file scritto da altri? :)
Ripeto: se l'ambiente da cui proviene il file è linux, dovrebbe essere semplice. Basta, secondo me aprire, un file .txt qualsiasi e provare a leggerne il contenuto con line input.
Se il file proviene da altri ambienti, bisognerebbe studiarci un pò sopra e capire come vengono gestiti le separazioni dei campi di ciascun record e cosa viene scritto come carattere di fine riga.
Io non ho esperienze del genere e perciò non posso essere di maggiore aiuto.
 :ciao:
:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Leggere le Righe di Un file
« Risposta #12 il: 15 Luglio 2015, 12:59:46 »
Se il file proviene da altri ambienti, bisognerebbe studiarci un pò sopra
E' sufficiente vedere proprio l'help in linea della proprietà .EndOfLine, poiché sono riportati là.
« 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 vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Leggere le Righe di Un file
« Risposta #13 il: 15 Luglio 2015, 13:47:05 »
Il carattere di fine linea può essere impostato con la proprietà Stream.EndOfLine. di conseguenza la funzione Line Input troncherà la linea quando incontra tale sequenza.

Quella proprietà penso che vada settata prima di usare Line Input, magari, come dice Sotema, controllando il file subito dopo l'apertura.

Effettivamente, contrariamente a come supponevo, la proprietà .EndOfLine va impostata con la costante coerente con il tipo di codifica del fine-riga contenuto dal file di testo.
Dunque, la proprietà .EndOfLine della variabile di tipo File non è in grado di dirci a priori quale sia il tipo di carattere di fine-riga; ci può dire - invece - il tipo da noi impostato per far troncare ciascuna linea presente nel file di testo in modo coerente con la codifica.

Poniamo il caso di avere un file di testo, la cui rappresentazione esadecimale è la seguente:
 46 6F 72 75 6D 20 64 69 0D 47 61 6D 61 62 73 0D

Da notare i due valori di fine-riga 0x0D, quindi appartenenti alla codifica Mac.

Leggiamo quel file di testo con il seguente codice Gambas:
Codice: gambas [Seleziona]
Public Sub Main()

  Dim s As String
  Dim fl As File
  
    fl = Open "/percorso/del/file/di/testo" For Input
    
' Sapendo a priori che la codifica del file di testo è quella del Mac,
' impostiamo la proprietà ".EndOfLine" in modo coerente:
    fl.EndOfLine = gb.Mac
    
    While Not Eof(fl)
      Line Input #fl, s
      Print s
    Wend

    fl.Close

End



oppure con la proprietà .Lines:
Codice: gambas [Seleziona]
Public Sub Main()

  Dim s As String
  Dim fl As File
  
    fl = Open "/percorso/del/file/di/testo" For Input
    
    fl.EndOfLine = gb.Mac
    
    For Each s In fl.Lines
      Print s  
    Next

    fl.Close

End



o anche con il metodo .ReadLine:
Codice: gambas [Seleziona]
Public Sub Main()

  Dim s As String
  Dim fl As File
  
    fl = Open "/percorso/del/file/di/testo" For Input
    
    fl.EndOfLine = gb.Mac
    
    While Not Eof(fl)  
      s = fl.ReadLine()
      Print s  
    Wend
    
   fl.Close

End
« Ultima modifica: 15 Luglio 2015, 21:23:10 da vuott »
« 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 vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Leggere le Righe di Un file
« Risposta #14 il: 15 Luglio 2015, 13:55:01 »
.....qualora non si intenda utilizzare la risorsa Open...For Input, ma si preferisca la Classe File, si potrà ovviamente fare così con la funzione Split():
Codice: gambas [Seleziona]
Public Sub Main()

  Dim s As String

   s = File.Load("/percorso/del/file/di/testo/codificato/in/Mac")

   For Each s In Split(s, "\x0D")
      Print s
    Next

End



oppure con la funzione Scan():
Codice: gambas [Seleziona]
Public Sub Main()

  Dim s As String

   s = File.Load("/percorso/del/file/di/testo/codificato/in/Mac")

   For Each s In Scan(s, "*\x0D*")
      Print s
    Next

End
« Ultima modifica: 15 Luglio 2015, 14:00:10 da vuott »
« 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. »