Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    51

    [VB.NET] Leggere un file CSV velocemente

    Salve a tutti,
    ho un file CSV molto lungo, e vorrei che il mio programma lo leggesse in modo veloce. Ho provato questo codice:
    codice:
    Public Sub ReadCSV(CSV As String) 
    Dim ary(0) As String 
    Dim sr As New System.IO.StreamReader(CSV) 
    Dim placeholder As Integer = 0 
    
    Do While sr.Peek <> -1 
    ReDim Preserve ary(placeholder) 
    placeholder += 1 
    Loop 
    
    Console.WriteLine("Waiting for the file 'verified_online.csv'...") 
    Console.WriteLine("Reading data from 'verified_online.csv") 
    Console.WriteLine(ary) 
    End Sub
    ma non sembra funzionare, è troppo lento!
    Volevo sapere se c'è un modo o un trucco per rendere la lettura più veloce.

    Grazie,
    Panda

  2. #2
    Mi spieghi che cosa avrebbe a che vedere con la lettura di un CSV quel codice? Mi pare solo un modo estremamente inefficiente per ridimensionare ary alle dimensioni del file...
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    In effetti i dati del file non sono mai letti ...

    Forse c'è altro codice che non ci hai fatto vedere ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    codice:
    Public Sub ReadCSV(CSV As String)
    	Dim ary(0) As String
    	Dim sr As New System.IO.StreamReader(CSV)
    	Dim placeholder As Integer = 0
    
    	Do While sr.Peek <> -1
    		ReDim Preserve ary(placeholder)
    		ary(placeholder) = sr.ReadLine
    		placeholder += 1
    	Loop
    
    	Console.WriteLine("Waiting for the file 'verified_online.csv'...")
    	Console.WriteLine("Reading data from 'verified_online.csv")
    	Console.WriteLine(ary)
    End Sub
    Qualcosa di simile vidi tanti anni fa in rete e davvero mi stupii di un codice tanto assurdo E' molto lento perchè ad ogni iterazione viene ricreato un nuovo vettore su cui si copiano i dati del precedente. Si verifica pure se, al posto del vettore hai una stringa, su cui fai, ad ogni iterazione stringa &= sr.ReadLine

    Io, in questo caso userei un List(Of string) semplice e veloce, oppure qualcosa del genere
    codice:
        Sub Main()
    
            Dim sw As New Stopwatch()
            sw.Start()
            Dim v As String() = ReadCSV("c:\tmp\prova.csv")
            sw.Stop()
            Console.WriteLine(sw.ElapsedMilliseconds)
    
            Console.Write("Premere un tasto per continuare . . . ") : Console.ReadKey()
        End Sub
    
        Public Function ReadCSV(csv As String) As String()
            Dim result(-1) As String 'creo un vettore di 0 elementi stringa
            Array.Resize(Of String)(result, 4) 'dimensione iniziale buffer
    
            Dim c As Integer = -1 'contatore
    
            Using sr As New StreamReader(CSV)
                Do While Not sr.EndOfStream
                    c += 1
                    Dim u As Integer = result.Length
                    If c >= u Then
                        Array.Resize(Of String)(result, u + u) 'raddoppio la dimensione del vettore
                    End If
                    result(c) = sr.ReadLine 'leggo la riga
                Loop
            End Using
            Array.Resize(Of String)(result, c + 1)
            Return result
    
        End Function
    Pietro

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    51
    Grazie a tutti

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.