Italian Caricamento csv in una tabella DB

Luca1967

Active Member
Ciao a tutti.
Devo caricare un csv composto da 140.000 righe in una tabella.
Ci riesco ma il caricamento è molto lento.
Ho provato con la libreria DBUTILS ma mi dà l'errore : Uncaught translation error: min-sdk-version >= 26)
Esiste un metodo rapido e veloce per caricare tutti i dati? Al momento ho limitato il caricamento di questi dati.
Grazie a tutti
 

amorosik

Expert
Licensed User
Ciao a tutti.
Devo caricare un csv composto da 140.000 righe in una tabella.
Ci riesco ma il caricamento è molto lento.
Ho provato con la libreria DBUTILS ma mi dà l'errore : Uncaught translation error: min-sdk-version >= 26)
Esiste un metodo rapido e veloce per caricare tutti i dati? Al momento ho limitato il caricamento di questi dati.
Grazie a tutti

Se per 'tabella' intendi la tabella di un db qualsiasi, allora ti consiglierei di provare ad eliminare gli indici prima dell'importazione, tiri su i dati, e poi ripristini gli indici
Poi se ci spieghi cosa intendi (in termini di codice usato) per "caricare un csv", ancora meglio
 

Luca1967

Active Member
Se per 'tabella' intendi la tabella di un db qualsiasi, allora ti consiglierei di provare ad eliminare gli indici prima dell'importazione, tiri su i dati, e poi ripristini gli indici
Poi se ci spieghi cosa intendi (in termini di codice usato) per "caricare un csv", ancora meglio
Per 'tabella' intendo la tabella di un database. Per 'CSV' intendo un file CSV spaziato da ",".
Scarico il file CSV tramite HttpJob
Poi leggo il file e lo memorizzo.

Dim lista As List
lista.Initialize
lista=su.LoadCSV(File.DirInternal, "file1.txt",",")

Scrivo la tabella in questo modo:


For i = 0 To lista.Size - 1
Items = lista.Get(i)
Dim x1As String = Items(0)
Dim x2 As String =Items(1)
Dim x3 As String =Items(2)
Dim x4 String =Items(3)
Dim x5 As String =Items(4)
Dim x6 As String =Items(8)

x6=x6.Replace("'", "''")


cmd = "insert into tabella1 (y1,y2,y3,y4,y5,y6) " & _
" values ('" & x1 & "','" & x2 & "'" & _
",'" & x3& "'" & _
",'" & x4 & "'" & _
",'" & x5 & "'" & _
",'" & x6 & "'" & _
")"

db.ExecNonQuery(cmd)
End If
Next

db.TransactionSuccessful


Funziona tutto ma con un file CSV di 140.000 righe ci mette tantissimo.
 

udg

Expert
Licensed User
Longtime User
Se è un'operazione "una tantum" potresti eseguirla tramite un tool di importazione dati dedicato al DBMS che utilizzi (es. DB Browser).
A quel punto avresti il DB pronto e pulito e ti resterebbe solo di allegarlo al tuo sw oppure di scaricarlo (tramite codice) da un tuo server o spazio di storage.
 

amorosik

Expert
Licensed User
Per 'tabella' intendo la tabella di un database. Per 'CSV' intendo un file CSV spaziato da ",".
Scarico il file CSV tramite HttpJob
Poi leggo il file e lo memorizzo.

Dim lista As List
lista.Initialize
lista=su.LoadCSV(File.DirInternal, "file1.txt",",")

Scrivo la tabella in questo modo:


For i = 0 To lista.Size - 1
Items = lista.Get(i)
Dim x1As String = Items(0)
Dim x2 As String =Items(1)
Dim x3 As String =Items(2)
Dim x4 String =Items(3)
Dim x5 As String =Items(4)
Dim x6 As String =Items(8)

x6=x6.Replace("'", "''")


cmd = "insert into tabella1 (y1,y2,y3,y4,y5,y6) " & _
" values ('" & x1 & "','" & x2 & "'" & _
",'" & x3& "'" & _
",'" & x4 & "'" & _
",'" & x5 & "'" & _
",'" & x6 & "'" & _
")"

db.ExecNonQuery(cmd)
End If
Next

db.TransactionSuccessful


Funziona tutto ma con un file CSV di 140.000 righe ci mette tantissimo.

Definire 'tantissimo', prego
 

amorosik

Expert
Licensed User
Per 'tabella' intendo la tabella di un database. Per 'CSV' intendo un file CSV spaziato da ",".
Scarico il file CSV tramite HttpJob
Poi leggo il file e lo memorizzo.

Dim lista As List
lista.Initialize
lista=su.LoadCSV(File.DirInternal, "file1.txt",",")

Scrivo la tabella in questo modo:


For i = 0 To lista.Size - 1
Items = lista.Get(i)
Dim x1As String = Items(0)
Dim x2 As String =Items(1)
Dim x3 As String =Items(2)
Dim x4 String =Items(3)
Dim x5 As String =Items(4)
Dim x6 As String =Items(8)

x6=x6.Replace("'", "''")


cmd = "insert into tabella1 (y1,y2,y3,y4,y5,y6) " & _
" values ('" & x1 & "','" & x2 & "'" & _
",'" & x3& "'" & _
",'" & x4 & "'" & _
",'" & x5 & "'" & _
",'" & x6 & "'" & _
")"

db.ExecNonQuery(cmd)
End If
Next

db.TransactionSuccessful


Funziona tutto ma con un file CSV di 140.000 righe ci mette tantissimo.


Se stai cercando di spremere prestazioni come mai non tagli via le sei assegnazioni e vai sull'insert direttamente con Items(0) al posto di x1 ?
Io non caricherei tutto in una lista e poi da questa alle insert
E' un passaggio che non serve
Leggerei riga per riga il file csv, separerei i vari campi ed andrei sulla insert
Ma facci capire, quante insert/secondo fa il codice cosi' com'e ora?
Ed a quante vorresti arrivare, almeno?
 
Top