Newsgroup: it.comp.lang.visual-basic
Titolo: File di testo molto grandi

Ho la necessità di dover leggere un file di testo (Saldi.txt che viene
generato da AS/400) che contiene più di 40.000 righe e scrivere su un
tabella (tblSaldi) in un database access. In VB ho usato questo codice:
    Open "c:\FileAS400\Saldi.txt" For Input As #1
        Do While Not EOF(1)
            DoEvents
            Line Input #1, Riga
            RsImp_SMA.FindFirst ("MagSMA='" & Trim(Mid(Riga, 2, 2)) & "' AND
ArtSMA='" & Trim(Mid(Riga, 4, 14)) & "'")
            If RsImp_SMA.NoMatch Then
                RsImp_SMA.AddNew
            Else
                RsImp_SMA.Edit
            End If
            RsImp_SMA!TipRsm = Trim(Mid(Riga, 1, 1))
            RsImp_SMA!MagSma = Trim(Mid(Riga, 2, 2))
            RsImp_SMA!ArtSma = Trim(Mid(Riga, 4, 14))
            RsImp_SMA!SalDat = IIf(IsNumeric(Mid(Riga, 18, 11)), Mid(Riga,
18, 9) & "," & Mid(Riga, 27, 2), Null)
            RsImp_SMA!SalDin = IIf(IsNumeric(Mid(Riga, 29, 11)), Mid(Riga,
29, 9) & "," & Mid(Riga, 38, 2), Null)
            RsImp_SMA.Update
        Loop
    Close #1
Qualcuno sa dirmi se c'è un modo diverso (più veloce!) per compiere questa
operazione?
Grazie anticipatamente. Vincenzo 
vinc...@tiscalinet.it

 wrote in message
8rs4u1$cjs$1...@nslave3.tin.it...


 ha scritto nel messaggio
news:8rs77k$57s$1...@nslave2.tin.it...


 wrote in message
8rsers$lpu$1...@nslave3.tin.it...



Una soluzione che ho usato io una volta (file con + di 30000 righe) é stata
di Inserire in Acces una tabella collegata al file di testo da cui importi i
dati ed utilizzare delle query per velocizzare il tutto.
Questo, se da una parte velocizza, dall'altra ti costringe a :
1) Usare sempre lo stesso nome di file di importazione
2) Impossibililtà di fare manipolazioni complicate sui dati in ingresso
Vedi tu se ti conviene

operazione?
Ho avuto lo stesso problema, ma - alla fine - ho visto che la cosa
migliore e più sicuro è "armarsi di santa pazienza" e fare proprio
come hai fatto tu. Ad esempio se hai un minimo controllo da effettuare
sui dati da trasferire, collegarsi a file di testo darà per forza
problemi! 
E i controlli che non devi fare ora ... magari li dovrai fare alla
prossima release del programma.
ErreBi

 tabella (tblSaldi) in un database access. In VB ho usato questo codice:
Tralascio il codice. Ti propongo un altro metodo.
Se il file viene da AS400, è un database a campi fissi, come
si deduce anche da quello che scrivi. Se il record è a lunghezza fissa,
è possibile leggerlo tramite una struttura UDT, aprendo il file in
modalità binaria. Ad esempio per un record di 4 campi:
Public Type AS400_REC_TYPE
   strFld1 As String * 20
   lngFld2 As String * 8
   strFld3 As String * 12
   dblFld4 As String * 10
   recFiller As String * 2
End Type
presuppone un record di 50 caratteri, in cui il primo campo contiene
del testo, il secondo un valore long, il terzo una stringa, in quarto un
valore Double. Il quinto membro è un filler (uso il termine in maniera
impropria, ma immagino tu sappia cos'è un campo filler); viene usato
perché in una lettura binaria, al termine del record ci sarà un carattere
&H10 oppure &H13 &H10. Nel primo caso recFiller avrà lunghezza 1.
Procedendo, si calcola la lunghezza del file e, in base alla lunghezza del
record, si procede con la lettura.
Dim recStruct As AS400_REC_TYPE
Dim recLen As Long
Dim FilePos As Long
Dim FileLen As Long
   [Open Database]
   FileNum = FreeFile(0)
   recLen = Len(recStruct)
   Open [FileName] For Binary As #FileNum
   FileLen = LOF(FileNum)
   Do
      ' Legge un numero di byte uguale alla struttura data
      Get #FileNum, , recStruct
      ' Tralascio la verifica dell'esistenza del record. Puoi
      ' dedurre il metodo da quello che segue.
      rs.AddNew
      ' Il tipo di dati dei campi Fld(x) del database rispecchia quello
      ' del UDT descritto
      ' Campo testo: elimina gli spazi in eccesso. Solo a destra.
      rs!Fld1 = RTrim$(recStruct.strFld1)
      ' Campo numerico lungo: la conversione è automatica,
      ' anche se ci sono spazi prima del numero.
      rs!Fld2 = recStruct.lngFld2
      ' Stessa situazione
      rs!Fld3 = RTrim$(recStruct.strFld3)
      rs!Fld4 = recStruct.dblFld4
      rs.Update
      ' Verifica la posizione di lettura all'interno del file
      FilePos = FilePos + recLen
      If FilePos >= FileLen Then
         ' Se si è raggiunta la fine, si termina il ciclo
         Exit Do
      End If
   Loop
   Close #FileNum
   [Close Database]
Per ridurre ulteriormente i tempi di lettura, se non è necessario
effettuare altre operazioni durante il processo, elimina DoEvents.