[VS2005] problema caricamento file CSV

giovedì 09 luglio 2009 - 22.15

niclo Profilo | Newbie

ciao a tutti,

Ho creato un'applicazione form che deve caricare i dati di un file .csv in un database SQL Server 2005.

Mi sono accorto di una cosa strana: quando un valore del file csv è negativo, allora viene riconosciuto dal codice di caricamento con valore NULL.
La cosa trana è che quando il file contiene pochi record (100) il problema non sussiste, mentre quando cerco di caricare un file con molti record (12000) allora si presenta il problema.

Operativamente apro il file csv con OleDB e poi faccio ciclare un record alla volta, andando a caricare un Datarow (identica struttura del record) nei campi corretti. Poi eseguo alla fine un Update del dataset (a cui ho aggiunto tutti i datarow creati) per aggiornare il database SQL

Qualcuno saprebbe spiegarmi il perchè?

Jeremy Profilo | Guru

Ciao Stefano.
Con le poche informazioni (riguardo al codice) che dai .... ti si può solo dire che probabilmente fino a 100 record i valori sono corretti, mentre, quando leggi 12000 record, in quei 12000, c'è un record con dei valori non corretti.
Per darti un aiuto in più dovresti:
- Mostrarci come è strutturato il file csv
- Mostrarci come gestisci eventuali eccezioni
- Come costruisci le DataRow per popolare il DataSet.
- Come sono titpizzate le colonne di destinazione nella tabella del Db
A te potrà sembrare inutile ..... a noi può darci le informazioni necessarie per individuare il problema.

facci sapere....
ciao

R3GM4ST3R Profilo | Junior Member

Ciao, io per i file CSV preferisco il vecchio parsing manuale...
Questo funziona al 100% su file di grosse dimensioni!
Ti rimando al link

http://www.dotnethell.it/forum/messages.aspx?ThreadID=29868

Comunque, l'unico motivo che mi viene in mente, è che il tipo di dato impostato per gestire quella colonna, non è compatibile con il dato che gli stai inserendo...(detto in maniera molto spartana)


Ciao


Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. (Albert Einstein)

niclo Profilo | Newbie

Questo che propongo è il codice che ho utilizzato per caricare nella tabella Tab1 del db i dati del file CSV:

Dim i As Integer
Dim conCSV As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='text;HDR=Yes;FMT=Delimited;';Data Source=" & strDir)
Dim conSQL As New OleDbConnection(mConnSQL)

Try
Dim intRows As Integer
Dim l As Long
Dim dsCSV As New DataSet
Dim ds As New DataSet
Dim dr As DataRow
Dim da As New OleDbDataAdapter("SELECT * FROM Tab WHERE ID = (SELECT Max(ID) FROM Tab1)", conSQL)
Dim du As New OleDbCommandBuilder(da)
da.Fill(ds, "Tab1")

conCSV.Open()
Dim daCSV As New OleDbDataAdapter("SELECT * FROM [Prova]", conCSV)
daCSV.Fill(dsCSV, strFile)

If ds.Tables("Tab1").Rows.Count = 0 Then
l = 0
Else
l = ds.Tables("Tab1").Rows(0).Item("ID")
End If

intRows = dsCSV.Tables("Prova").Rows.Count
For i = 0 To (intRows - 1)
dr = ds.Tables("Tab1").NewRow
dr("ID") = l + 1 + i
dr("Cliente") = dsCSV.Tables("Prova").Rows(i).Item(1)
dr("Ordine") = dsCSV.Tables("Prova").Rows(i).Item(2)
dr("Quantita") = dsCSV.Tables("Prova").Rows(i).Item(3)
dr("Prezzo") = dsCSV.Tables("Prova").Rows(i).Item(4)
dr("ValoreAggiunto") = dsCSV.Tables("Prova").Rows(i).Item(5)
ds.Tables("ARCOrdini").Rows.Add(dr)
Next
da.Update(ds, "Tab1")

conSQL.Close()
conCSV.Close()
Catch ex As Exception
MsgBox(ex.Message)
End Try

Praticamente ho eseguito questo procedimento:
- Apro con OleDB il file CSV e carico il contenuto in un dataset
- Faccio ciclare ogni record e passo i valori interessati un un Datarow che ha struttura identica
- Aggiungo il datarow al dataset
- Eseguo l'aggiornamento

Il problema lo riscontro solo sul campo "ValoreAggiunto" del file CSV quando ha dei valori del tipo -0,01234
Il corrispondente campo nella tabella del db è del tipo Float

Ho provato a convertire il file CSV in XLS. Poi ho caricato quest ultimo nello stesso modo del codice porposto e il problema non si verifica.

E' possibile che ci siano dei problemi con i delimitatori del file CSV?

R3GM4ST3R Profilo | Junior Member

Forse il problema potrebbe essere la virgola come separatore decimale...quando fai la insert nel tipo float prova a mettere il punto.
Banalmente prova a fare una replace(val,",",".") quando metti il valore letto dal csv nella datatable.

Ciao!

Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. (Albert Einstein)
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5