Newsgroup: it.comp.lang.visual-basic
Titolo: dividere file testo...

devo dividere un file di testo grande i 5 parti. diciamo 100 milioni di 
righe da dividere in blocchi da 20 milioni.
il classico metodo � quello di leggere riga per riga e scriverle in nuovi 
file.
ma c'� un metodo pi� veloce?
marco 

marcus ha scritto:

Che io sappia no... da qualche parte qualcuno deve pur leggere ci� che �
nel file origine per scriverlo nei file destinazione.
In ogni caso se stai usando .Net, con uno StramReader ed uno
StreamWriter te le sbrighi in fretta.
Io su file da 20 milioni di righe ci metto 2/3 minuti su una virtual
machine neanche troppo potente. Credo che 10 minuti (ma anche meno!) di
attesa per un file da 100 milioni di righe non dovrebbero essere un
problema.
Nicola

 Io su file da 20 milioni di righe
Hai messo in fila tutte le mail di spam che ti sono arrivate ? :-))
Bye, G. 

 StreamWriter te le sbrighi in fretta.
In VB classic come l'approcceresti?
-- 
Greg 

 problema.
Confermo,
ho appena scritto un file di 20.000.000 di righe in 3'05".
Il file creato � grande 839.844 Kb
Il problema nasce dal fatto che non si pu� usare la seguente sintassi,
per via del fatto che lo spazio stringa � limitato:
stringa=split(input(lof(1),#1),vbcrlf)
ma bisogna usare il metodo ben pi� lento:
Line Input #1, Stringa
-- 
Ciao Fede
By Chicco Production
http://bcp.freetools.it

 ha scritto

questa era una prova del 2003:
http://www.sundaysw.com/sw/cod_file_lines/
ciao

 Hai messo in fila tutte le mail di spam che ti sono arrivate ? :-))
Solo quelle del 2009 ovviamente :)
No, i file che ci arrivano sono dei CSV con transazioni bancarie e piani
di ammortamento che, su volumi di una PrimariaBancaï¿œ italiana, fanno piï¿œ
o meno 20 milioni di righe a settimana.
Nicola

 Line Input #1, Stringa
Puoi però usare una via di mezzo, cioè non usando Line Input ma
allocando la stringa a blocchi, invece di leggere tutto il file... con
blocchi molto grossi, ma comunque entro i limiti di memoria
disponibili, la lettura si velocizza un bel po'.
Chiaramente occorre un minimo di codice in più per ricomporre
correttamente la riga a cavallo di due blocchi.

 correttamente la riga a cavallo di due blocchi.
ecco...mi riferivo ad una cosa del genere...
puoi spiegarmi meglio come fare?
grazie 

 grazie
Una roba del genere (adattato da altro codice che avevo per le mani,
potrebbero esserci degli errori di cut&paste):
Dim FBuffer()       As Byte
Dim FileSize        As Long
Dim BlockSize       As Long
Dim LastBlockSize   As Long
Dim FileCount As Integer, i As Integer
FileSize = FileLen("c:\originale.dat")
BlockSize = 20000 * 1024 '20 MB
FileCount = FileSize \ BlockSize
LastBlockSize = FileSize Mod BlockSize
If FileCount = 0 Then
    BlockSize = FileSize
    FileCount = 1
ElseIf LastBlockSize > 0 Then
    FileCount = FileCount + 1
End If
i = 1
Open "c:\originale.dat" For Binary Access Read Lock Read Write As #1
Do While Not EOF(1)
    If i < FileCount Then
        ReDim FBuffer(BlockSize)
    Else
        ReDim FBuffer(LastBlockSize)
    End If
    Get #1, , FBuffer
    Open "c:\blocco" & i & ".dat" For Binary Access Write Lock Read
Write As #2
    Put #2, , FBuffer
    Close #2
    i = i + 1
Loop
Close #1
Questo però fa uno split del file "brutale"; nel tuo caso, che vuoi
mantenere i record a cavallo del file intatti, come dicevo sopra
dovrai aggiungere del codice di controllo in più per fare in modo di
ricostruire l'ultima riga.
Allo stesso modo si complica un po' se vuoi che i blocchi abbiano la
stessa dimensione in termini di righe, piuttosto che di byte, come fa
il codice qui sopra


grazie... me lo studier� un p�...