2010-07-14 8 views
0

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?

Répondre

4

J'ai eu la même expérience avec cette .... J'ai trouvé fantastique bibliothèque à CodeProject pour lire les fichiers CSV:

http://www.codeproject.com/KB/database/CsvReader.aspx

La bibliothèque gère tout comme les CSVs d'analyse syntaxique correctement pour ne pas avoir à vous soucier de problèmes comme ceux-ci. Il est très facile à utiliser et les données peuvent être renvoyées via un DataTable.

Il est devenu une partie essentielle de ma bibliothèque de code. Je vous recommande fortement de le vérifier.

+0

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

2

Je recommanderais d'abandonner Excel, et utiliser quelque chose le long de LINQ to CSV pour gérer votre traitement. Vous éliminez la dépendance sur Excel, avez un contrôle direct sur la frappe et son poids plus léger pour démarrer.

http://www.codeproject.com/KB/linq/LINQtoCSV.aspx

1

Ma méthode préférée pour lire des fichiers est d'utiliser une bibliothèque externe http://www.filehelpers.com/

Description:
Les FileHelpers sont une bibliothèque .NET gratuit et facile à utiliser pour importer/exporter des données de longueur fixe ou délimité enregistrements dans des fichiers, des chaînes ou des flux.

Il a tout et l'évier de la cuisine et encore petit ..

excel La course est jamais une bonne idée dans une application asp.net et est individuellement interdit par Microsoft.

Vous pouvez toujours essayer de ODBC qui a une façon de spécifier la mise en page avec un fichier ini pour une solution que Microsoft, bien que les jours de ODBC sont numérotés

+0

+1 C'est un excellent lien que vous avez trouvé! – Dal

Questions connexes