Ok, cela a commencé comme une tâche assez simple pour importer des données clients dans notre base de données. Le script ci-dessous charge toutes les données en mémoire et permet ensuite la manipulation après.Importer des données à partir de CSV
string ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"" + FileLoc + "\"; Extended Properties=\"text;HDR=Yes;FMT=Delimited(,)\"";
using (OleDbConnection conn = new OleDbConnection(ConString))
{
using (OleDbCommand cmd = new OleDbCommand("SELECT * FROM DataInput.csv", conn))
{
conn.Open();
using (OleDbDataReader dr = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
{
int RowNumber = 0;
while (dr.Read())
{
if(RowNumber==0)
{
for (int i = 0; i < dr.FieldCount; i++)
{
TitleData.Add(new CSVTitleData() {ColumnID = i,ColumnName = dr.GetValue(i).ToString()});
}
}
else
{
var DataToInsert = new List<CSVData>();
for (int i = 0; i < dr.FieldCount; i++)
{
if (i == 8)
{
var A = dr.GetValue(i);
Console.WriteLine(A.GetType().ToString() + " - " + i);
}
DataToInsert.Add(new CSVData(){ColumnID = i,Value = dr.GetValue(i).ToString()});
}
Content.Add(DataToInsert);
}
RowNumber++;
}
}
}
}
Cela fonctionne bien jusqu'à ce qu'il y a des données comme
4950
4951
4952
4998
2024
4176
7025-1
RVAC010
RVAC011
4945
4946
4947
4948
Excel essaie d'être intelligent et lit chacun des champs comme un Int. Résultant int ceux avec une lettre en étant lus comme DBNull.
Maintenant, j'ai fait quelques lectures et il y a beaucoup de gens avec cette question, mais pas de solution solide. Une des solutions possibles est de créer un Scheme.ini Je me demande si quelqu'un peut m'aider avec le format exact de cela? Ou peut-être il y avait un plus facile de lire dans le CSV?
Juste un FYI ... CSVReader, contrairement à LINQ au format CSV, exige que vous convertissiez chaque valeur que vous lisez. LINQ to CSV vous permet de définir des classes concrètes représentant des lignes dans un fichier CSV, avec la conversion automatique de chaque valeur en propriété. – jrista