Newsgroup: it.comp.lang.visual-basic
Titolo: Righe di un file senza aprirlo

fino ad adesso ho fatto cosě:
(codice 
VB.NET
)
-------------------------------------
FileOpen(1, Path, OpenMode.Input)
While Not EOF(1)
    LineInput(1)
    riga += 1
End While
FileClose(1)
--------------------------------------
c'č un metodo + veloce?
(anche in codice VB6 va bene...)
grazie,
Licantrop0 / HackZ XtremE Crew since 2001
Mail: 
Lican...@hackzxtreme.cjb.net
Main Site: 
www.hackzxtreme.cjb.net

 FileClose(1)
Se il file ha righe a lunghezza fissa (NET permettendo) puoi aprire il file
e poi ricavare il numero di righe da Lof(1)/lunghezza_riga

 e poi ricavare il numero di righe da Lof(1)/lunghezza_riga
humm... nel mio caso potrebbe andare..
ma se ho la lunghezza riga a rampazzo, non c'è proprio altro modo?
che ne so... con qualche API?
grazie ancora,


 che ne so... con qualche API?
Bisognerebbe caricare tutto il file in una variabile stringa in memoria e
contare le occorrenze di vbCrLf. Ciascuna indica un fine riga, quindi il
numero totale delle righe (+/- 1 se l'ultima non ha il vbCrLf finale).

 numero totale delle righe (+/- 1 se l'ultima non ha il vbCrLf finale).
Una cosa del genere (non provata e, comunque, in VB6):
    canale = FreeFile
    Open "C:\File.txt" For Input Shared As #canale
    dim s as String
    s = Input$(LOF(canale), #canale)
    close canale
    partenza=1
    t_righe=0
    do
        fr=instr(partenza,s,vbCrLf)
        if fr=0 then exit do
        t_righe=t_righe+1
        partenza=fr+2
    loop
    msgbox "Il file contiene " & t_righe & " righe"

 ha scritto nel messaggio
news:5arQ8.44380$j65.1...@twister1.libero.it...

Ti descrivo quello che ho fatto io xche non ho il codoce ha portata di mano.
Usando  l'oggetto file system Object, apri il file in append con il sotto
oggetto Textstream, a questo punto dopo una attesa che di sicuro č piů breve
di quella del codice sopra avrai il numero della linea corrente, chiudi il
file e sottrai 1 dal valore = numero di linee nel file.
Appena reinstallo VB ti posto il codice se vuoi.

 numero totale delle righe (+/- 1 se l'ultima non ha il vbCrLf finale).
    Non so quanto sia prudente mettersi in mezzo in una discussione fra Lupo
e Licantrop0... cmq...
 
http://www.it-lang-vb.net/Archivio/FAQ/FAQ00017.HTM
--
Ciao.
Maurizio
--------
?SPQR(C)
 X
--------

     
http://www.it-lang-vb.net/Archivio/FAQ/FAQ00017.HTM
Lupo è un onesto e ammette i propri limiti.
Ho bookmarkato il tuo link. Grazie!

     
http://www.it-lang-vb.net/Archivio/FAQ/FAQ00017.HTM
ehehe, ti hanno faqqato, eh maurizio ? :)
stavo per suggerire appunto split e vbcrlf.
quello che non riesco a capire e' il subject.
il 'senza aprirlo', per l'esattezza.
ciao, a-j.


perň č uno spreco di memoria enorme non mi sembra da faq.Usando split
raddoppi la memoria necessaria in quanto crea un array di stringhe,senza
valutare ilt empo di esecuzione.Il file da valutare puo essere di diversi
mega tra tempo di esecuzione e spreco di memoria non mi sembra poi cosě
consigliabile.
ciao :))

> "Franco" [...]:

    Pienamente d'accordo. :)
    Puo' essere simpatico rileggere su google i commenti che all'epoca
vennero fatti.


 il 'senza aprirlo', per l'esattezza.
    Questa e' la parte piu' affascinante della questione.


 Appena reinstallo VB ti posto il codice se vuoi.
grandissimo!
ci provo e ti so dire...
--


 ciao, a-j.
ciao,


 Maurizio
ciao,


 di Epoch e vedere quella + performante...
A questo punto anzichč la split si puň fare anche cosě:
s = Replace(strFile, vbCr, "")
Righe = len(s) - len(strFile) + 1 ' conto anche l'ultima non terminante con
CR[LF]
Ciao

 CR[LF]
ecco... il problema č che non so in anticipo se il file termina
con un a capo oppure no...
perň con un bel "int(Righe)" si dovrebbe essere a posto...
Ciao,


Qualcuno sa dirmi come posso gestire la trasmissione dei fax?        grazie.


Per prima cosa metti un Messaggio nuovo :-)))))

 memoria e contare le occorrenze di vbCrLf.
Tu si' pazz'
Dim fileno As Long, lines As Long, dummy As String * 1
Let fileno = FreeFile
Open "file" For Input Access Read Shared As #fileno
Do Until EOF(fileno)
 Line Input #fileno, dummy
 Let lines = lines + 1
Loop
Close #fileno
-- 
 < 
http://www.reactos.com/
 >  Open source clone of Windows NT. Current
     Don't stand, REACT!      version 0.0.19. C, C++ and ASM developers
                              and beta testers are welcome!

 terminante con CR[LF]
Ma perchè? perchè? perchè menti così brillanti vengono così facilmente 
offuscate dal Visual Basic? perchè tutti sembrano giocare a produrre la 
soluzione che "fa più fico", quando la migliore è la più ovvia?


 (anche in codice VB6 va bene...)
Licantropo, la mela d'oro dedicata "al piů bravo" va a te. Gli altri, 
stranamente, hanno tutti la mente obnubilata da esotiche sostanze 
chimiche, e sono riusciti a produrre le soluzioni piů fantasiosamente 
inefficienti. Questa č la via migliore, che richiede meno memoria e che 
gira piů veloce
Il fatto č che dubito che ti serva realmente sapere il numero di righe 
in un file :-) mi dici perchč ti serve saperlo? che vediamo se si puň 
risolvere meglio?


 (anche in codice VB6 va bene...)
La penultima riga l'hai letta? Dai, cambia nick, dai...!

Chiedo (ancora???) scusa a Zanna. Il mio OE (l'hai fatto te, Maya?) mostra
quello come primo messaggio. Si sarà impallato.

 (anche in codice VB6 va bene...)
ti deve andar bene per forza. non ho vbnet :))
ho fatto un po' di timing con gli esempi proposti, adattando i post.
gli interessati possono ovviamente correggere il codice qui sotto se l'ho
capito male. mi manca il codice di epoch. non ho mai usato il
filesystemobject, quindi ho preferito evitare. epoch, se lo posti aggiungo
anche il tuo.
qui sotto il codice del form. 4 command e un txt (per copia+incolla del
risultato).
piu' sotto i risultati.
ho compilato (seno' vb incasinava i conti) e ho rilanciato ogni volta l'exe,
cosi' win2000 ha azzerato ogni volta. sotto il form tenevo taskman, coi
processi ordinati per pid, cosi' l'exe era sempre l'ultimo.
il doppio valore e' ram /swap, prima, durante e dopo l'exe.
sul valore durante dovete fidarvi, perche' cambia in continuazione e finito
l'exe viene riportato subito ai valori iniziali. cioe': piu' o meno... e'
interessante anche per vedere cosa succede a aprire e chiudere programmi...
e' vero che non setto niente a nothing alla fine, ma e' anche vero che
_chiudo_ proprio l'exe, quindi ci dovrebbe pensare vb...
il txt e' di 28 mb, linee terminate normalmente con vbcrlf (ho dovuto
ritoccare il codice di zanna, che prevedeva solo cr). le righe sono 337392 o
337393, vedete voi :))
--
ciao, j.
www.sundaysw.com
-------------------------------------
Option Explicit
Private Sub cmdLineInput_Click() 'licantrop0
    Dim time1: time1 = Timer
    txtRisult = "": txtRisult.Refresh
    Dim s As String, j As Long, fNum As Long
    fNum = FreeFile
    Open App.Path & "\list.txt" For Input As #fNum
    's = Input(LOF(fNum), fNum)
    While Not EOF(fNum)
        Line Input #fNum, s
        j = j + 1
    Wend
    Close #fNum
    txtRisult = "righe: " & CStr(j) & " -- tempo: " & _
        Format(Timer - time1, "###,##0.000")
End Sub
Private Sub cmdReplace_Click() 'zanna
    Dim time1: time1 = Timer
    txtRisult = "": txtRisult.Refresh
    Dim s As String, j1 As Long, j2 As Long, fNum As Long
    Dim partenza As Long, t_righe As Long, fr As Long
    fNum = FreeFile
    Open App.Path & "\list.txt" For Input Shared As #fNum
        s = Input$(LOF(fNum), #fNum)
    Close fNum
    j1 = Len(s)
    s = Replace(s, vbCrLf, "")
    j2 = Len(s)
    ' conto anche l'ultima non terminante con CR [LF]
    ' divido per 2 perche vbcrlf=2 byte -- j
    txtRisult = "righe: " & CStr(((j1 - j2) / 2) + 1) & " -- tempo: " & _
        Format(Timer - time1, "###,##0.000")
End Sub
Private Sub cmdSplit_Click() 'maurizio
    Dim time1: time1 = Timer
    txtRisult = "": txtRisult.Refresh
    Dim intNFile  As Integer
    Dim strFullFileName As String
    Dim lngRows As Long
    strFullFileName = App.Path & "\list.txt"
    intNFile = FreeFile(0)
    Open strFullFileName For Input As intNFile
    lngRows = 1 + UBound(Split(Input$(LOF(intNFile), intNFile), vbCrLf))
    Close
    'Debug.Print "Righe: "; Format$(lngRows, "#,##0")
    txtRisult = "righe: " & CStr(lngRows) & " -- tempo: " & _
        Format(Timer - time1, "###,##0.000")
End Sub
Private Sub cmdVbCrLf_Click() 'lupo
    Dim time1: time1 = Timer
    txtRisult = "": txtRisult.Refresh
    Dim s As String, j As Long, fNum As Long
    Dim partenza As Long, t_righe As Long, fr As Long
    fNum = FreeFile
    Open App.Path & "\list.txt" For Input Shared As #fNum
        s = Input$(LOF(fNum), #fNum)
    Close fNum
    partenza = 1
    t_righe = 0
    Do
        fr = InStr(partenza, s, vbCrLf)
        If fr = 0 Then Exit Do
        t_righe = t_righe + 1
        partenza = fr + 2
    Loop
    txtRisult = "righe: " & CStr(t_righe) & " -- tempo: " & _
        Format(Timer - time1, "###,##0.000")
End Sub
-------------------------------------
line input
inizio: 2800 - 1940
durante: in taskman non si vede il cambiamento
dopo: 2976 - 1944
righe: 337392 -- tempo: 3,465
replace
inizio: 2788 / 1940
durante: toccato 227m / 227m
dopo: 6112 / 4740
righe: 337393 -- tempo: 17,926
split
inizio: 2788 / 1940
durante: toccato 80m / 80m
dopo: 6004 / 4732
righe: 337393 -- tempo: 16,691
vbcrlf
inizio: 2796 / 1940
durante: toccato 29m / 59m
dopo: 3112 / 1944
righe: 337392 -- tempo: 5,898

Cazzo, HO VINTO! :))))
--


 Dai, cambia nick, dai...!
Un'altra volta?


 soluzione che "fa più fico", quando la migliore è la più ovvia?
Non ho ancora ben capito da che parte stai :)
Intendi quella per cui si contano i CR?
Ma così è troppo facile! :)
Ciao

 Loop
Ah! questa :)
Beh, sě, č la prima che viene in mente, ma si stava divagando su soluzioni
astruse e performanti.
Ok, cercherň di dare solo risposte serie... ma cosě mi si taglia le gambe
alla fantasia :P
Ciao

 Un'altra volta?
Chi eri nell'altra vita?

 Ciao
--
ciao, j.
www.sundaysw.com

 ha scritto

perche' l'imperfetto ?

 perche' l'imperfetto ?
Solo perchè sono curioso di sapere il nick precedente.
Avresti preferito "Chi sei stata"?, "Chi fosti"?

 offuscate dal Visual Basic?
Questo era un complimento, vero? :)
Ciao

Lupo ha scritto:

Quanto per parlare e quanto per tacere ? :-PPP
-- 
ciao, hal.spy++

 Quanto per parlare e quanto per tacere ? :-PPP
infame :-) zitto tu, non abusare della mia gentilezza :-)


 Solo perchè sono curioso di sapere il nick precedente.
Juliet, precedentemente e per un breve periodo Juliet::Juliet, e prima 
ancora KJK::Juliet. Agli inizi Juliet
questo soddisfa la tua curiosità?


 infame :-) zitto tu, non abusare della mia gentilezza :-)
Non vi seguo. Fa niente.

 ha scritto nel messaggio
news:afek81$dg2ln$1...@ID-51318.news.dfncis.de...
Ecco Il Codice ke ti avevo promesso:
'
' Ricordarsi di attivare in Progetto >Riferimeti >"Microsoft Scripting
Runtime"
'
Dim Fso As FileSystemObject
Dim FIn As TextStream
'
Dim NumLine   As Long
'..........
    Set Fso = CreateObject("Scripting.FileSystemObject")
    Set FIn = Fso.OpenTextFile("c:\prova.txt", ForAppending, False,
TristateFalse)
    NumLine = FIn.Line - 1
    FIn.Close
'..........

 ha scritto nel messaggio
news:K%XT8.92629$j65.2...@twister1.libero.it...
Scusa il nik ma sono al lavoro....

 Ecco Il Codice ke ti avevo promesso:
ok, grazie. non sto a ripostare tutto il codice, e non ho avevo tempo per
usare un txt grosso, cosi' da avere modo di guardare l'uso della ram. ho
usato un 3.2mb. pc abbastanza scarico.
qui e' il codice di epoch adattato, sotto il timing.
Private Sub cmdFSO_Click() 'epoch
    Dim time1: time1 = Timer
    txtRisult = "": txtRisult.Refresh
    Dim Fso As FileSystemObject
    Dim FIn As TextStream
    Dim NumLine As Long
    Set Fso = CreateObject("Scripting.FileSystemObject")
    Set FIn = Fso.OpenTextFile(App.Path & "\list.txt", ForAppending, False,
TristateFalse)
    NumLine = FIn.Line - 1
    FIn.Close
    txtRisult = "righe: " & CStr(NumLine) & " -- tempo: " & _
        Format(Timer - time1, "###,##0.000")
End Sub
Private Sub cmdFSO_Click() 'epoch
righe: 105340 -- tempo: 0,240
Private Sub cmdLineInput_Click() 'licantrop0
righe: 105340 -- tempo: 0,482
Private Sub cmdReplace_Click() 'zanna
righe: 105341 -- tempo: 1,602
Private Sub cmdSplit_Click() 'maurizio
righe: 105341 -- tempo: 1,482
Private Sub cmdVbCrLf_Click() 'lupo
righe: 105340 -- tempo: 0,672
anche a riprovare un po' a casaccio, licantrop0 sembra dover passare la
bambolina a epoch e al fso.
--
ciao, j.
www.sundaysw.com