Newsgroup: it.comp.lang.visual-basic
Titolo: Sapere il n° di righe di un file di testo

come posso fare x sapere il n° di righe contenute in un file di testo ?
io avrei l'esigenza di aprire un file di testo (grosso sui 3 mb) ed elencare
il contenuto in una Listbox e mentre viene aperto, scatta il conteggio
percentuale.
mi hanno detto di fare così:
Dim i As Integer
Dim pippo As String
i = 0
Open nomefile for Input As #1
    While Not EOF(1)
        Line Input #1, pippo
        i = i + 1
    Wend
Close #1
ma così facendo dovrei aprirlo 2 volte, la prima x ricavare il n°
di righe, la 2° x elencare il contenuto nella lista.
passano 2 - 3 secondi di inattività (a causa del conteggio righe) prima
che si possa vedere il conteggio percentuale.
ad esempio se apro un file grosso in wordpad, esso parte subito col
conteggio percentuale.
nn c'è un altro modo x sapere il n° di righe in un millisecondo ?
magari con qualche API !!!!!!!

> "Batman Forever" [...]:

    Forse ti puo' andar bene qualcosa del genere:
Option Explicit
Private Sub Command1_Click()
  On Error GoTo errh
  Const c_sNomeFile _
    = "D:\PUBLIC\The New Hacker's Dictionary" _
    & "\The New Hacker's Dictionary.txt"
  Dim lLenCrLf  As Long
  Dim lFileLen  As Long
  Dim iFile     As Integer
  Dim sLine     As String
  Dim lOpened   As Long
  DoEvents
  Me.Command1.Enabled = False
  Me.Enabled = False
  Me.MousePointer = vbHourglass
  lLenCrLf = Len(vbCrLf)
  lFileLen = FileLen(c_sNomeFile)
  iFile = FreeFile(0)
  Open c_sNomeFile For Input Access Read As iFile
  Do Until EOF(iFile) = True
    With Me.Label1
      .Caption = Format$((lFileLen - lOpened) / lFileLen, "0.00%")
      .Refresh
    End With
    Line Input #iFile, sLine
    lOpened = lOpened + Len(sLine) + lLenCrLf
  Loop
ext:
  Close iFile
  Me.MousePointer = vbDefault
  Me.Enabled = True
  Me.Command1.Enabled = True
  Exit Sub
errh:
  With Err
    MsgBox .Description, , "ERRORE:" & .Number
  End With
  Resume ext
End Sub
--
Ciao.
Maurizio
--------
?SPQR(C)
 X
--------

 magari con qualche API !!!!!!!
Allora, del numero di righe non te ne fai niente.
Osservando proprio worpad non ti è venuto in mente che forse non usa questo
sistema?
A te basta sapere:
- quant'è _lungo_ il file (LOF(n_file) o FileLen(nome_file))
- quant'è che hai letto finora del file  (bytes = bytes + Len(strRiga))
La percentuale è presto fatta:
Perc = (bytes / LOF(n)) * 100 ' assegna LOF a una variabile:
                              ' non chiamarla nel ciclo 10000 volte!
P.S.: bisogna imparare a usare la testa, nel senso che si deve trovare la
soluzione con quello che si ha, non con quello che si vorrebbe avere.
Ciao

Io ho provato questo esempio però non funziona. Prima di tutto la
percentuale va al contrario, inizia dal 100% e poi decresce. Ma questo non è
un problema. Fino all'80% circa funziona bene, poi si ferma un pò e al 50%
si ferma definitivamente, cioè ha finito. Ma non dovrebbe arrivare allo 0%?
-Ciao-
-Luca450Mhz-


 Ma non dovrebbe arrivare allo 0%?
La pazienza senz'altro :)
Se ti limiti a fare copia-incolla del codice altrui abituati ad avere del
codice non funzionante, o meglio, del codice che _a_te_ non funziona.
Il suggerimento io te l'ho dato, risolvi tutto con 4 righe di codice e
funziona.
Vuoi proseguire nel "copio-senza-capire-e-spero"? Buona fortuna.
Ciao

 0%?
  A me ci arriva. Tu cosa gli dai "da mangiare"?



Questa volta ho semplicemente fatto il copia ed incolla perchè era una cosa
che mi interessava relativamente, e quindi ho voluto solo provare. Io sono
il primo che voglio capire come funziona un codice! Grazie della gentilezza!
;-)
-Ciao-
-Luca450Mhz-

   A me ci arriva. Tu cosa gli dai "da mangiare"?
Lascia stare! Facciamo finta che funziona! Altrimenti qui altri comlimenti
si sprecheranno! Grazie.
-Ciao-
-Luca450Mhz-

 spirito giusto per mandare avanti un NG come questo!
[...]
    Vorrei farti gentilmente notare due cose:
    La parola "spirito" ha almeno tre significati. Lasciando da parte quello
piu' alcoolico, che in questo caso spero non c'entri, ne restan due: tu ne
hai usato uno solo, io entrambi. Meglio abbondare che essere deficienti.
    Il ng, nel bene e nel male, lo *mandiamo avanti* tu ed io con quello che
entrambi scriviamo. Se ritieni che tu hai alzato la media e che io l'ho
abbassata danni non ne abbiamo fatto, dopotutto. Non trovi?


     Vorrei farti gentilmente notare due cose:
Lasciamo stare :)
Tu smazzati pure a aiutare gli altri, che poi tanto loro fanno ugualmente
come vogliono e se non funziona al primo F5 il fesso sei tu, cornuto e
maziato.
Ciao
z.EndOfTrhead()

 e se non funziona al primo F5 il fesso sei tu, cornuto e maziato.
    Fesso e' chi fesso si sente ed io, francamente, me ne infischio. :))


di cio' sia anche mio. 
Anche un po' di piu' che piccolissimo :-)
I tuoi esempi mi sono stati utili piu' di una volta, sei meglio della guida :-)
-- 
ciao, hal
per uno che chiede e chissa' se capisce, ce ne sono tanti altri che
leggono ed assimilano: Maurizio, vai avanti cosi' :-))))


Certo, ma questo è un NG sul VB, e non sui contrasti. Quello che voglio dire
io, perchè fare tutta questa polemica? Perchè offendere quando è possibile
evitare? Tutto qui! Scusami!
-Ciao-
-Luca450Mhz-

 Tutto qui! Scusami!
    Scusami anche tu.
    Ed ora torniamo a bomba: come e' andata a finire la faccenda del conto
alla rovescia? Hai potuto verificare cosa c'era che non andava nel tuo file?


 alla rovescia? Hai potuto verificare cosa c'era che non andava nel tuo
file?
Per quanto riguarda il conto alla rovescia, ho capito il perchè. Ho aperto
un altro file e si blocca sempre intorno al 29 %. E non riesco a capire il
xkè. Io penso che questa sia la riga di codice 'incriminata':
lOpened = lOpened + Len(sLine) + lLenCrLf
E' questo pezzo di codice che fa sbagliare i calcoli: quando viene terminato
il ciclo che legge il file questa variabile lOpened = 2.880.000 mentre la
variabile lFileLen = 4.095.963. Come vedi non combaciano, quando dovrebbero
essere uguali. Ed è per questo che la percentuale si ferma al 29%, perchè in
effetti non sono uguali questi valori. IMHO il problema è questo.
-Ciao-
-Luca450Mhz-

 effetti non sono uguali questi valori. IMHO il problema č questo.
    Ricordi quando domandavo "cosa gli dai da mangiare"? E' da qui che
bisogna partire: di che tipo di file stiamo parlando? L'esempio che ti ho
proposto la volta scorsa era fatto per un "file di testo". Un file cioe'
organizzato in righe di testo di lunghezza variabile, ciscuna terminata da
una coppia di caratteri Chr$(13) + Chr$(10), cioe' appunto vbCrLf.
    Se invece il file e' di altra natura bisognera' fare altre
considerazioni. Almeno credo, pero'... Al momento non connetto
perfettamente...
    Potrebbero pero' esserci anche altri problemi ma, non vedendo il
codice... capirai che non se ne puo' dir nulla.


 codice... capirai che non se ne puo' dir nulla.
Il codice è quello tuo con cambiato solo il percorso del file.
-Ciao-
-Luca450Mhz-

 oufitersen, ciao, ciun ciun cian!!" & vbCrLf
Put? (Print #)


 Put? (Print #)
Se uso for random devo usare la put. Se uso for output devo usare la print.
Aspetto un tuo consiglio.
-Ciao-
-Luca450Mhz-

 ha scritto
Stai costruendo un file di testo? Ovvero righe a lunghezza fissa o
variabile, ciascuna conclusa da vbCrLf?
Usa For Output (o For Append per accodare a un file già esistente), usa
"Print #canale, stringa" per concludere automaticamente ogni riga "printata"
con vbCrLf
Il Random e il Put vengono generalmente usati per files a struttura fissa
(quindi con record a lunghezza fissa e non necssariamente conclusi con
vbCrLf) sui quali ci si può posizionare su di un specifico numero di record.
Il topic è, di fatto, una Re: quindi non so quale fosse il contesto, ma mi
par di ricordare che si parlasse di files ASCII/testo.


Mi dispiace, ma non era questo il topic. Il problema non era la creazione
del f ile, in quanto anche con il mio metodo (anche se sarebbe migliore il
tuo) viene creato un file per lo scopo che ci serviva. Grazie cmq!
-Ciao-
-Luca450Mhz-