2009-09-22 6 views
24

Je ne peux pas sembler lire un fichier .csv en utilisant la chaîne de connexion suivante:c fichier csv # lecture ne donne pas un chemin valide

var fileName = string.Format("{0}{1}", AppDomain.CurrentDomain.BaseDirectory, "Uploads\\countrylist.csv"); 
string connectionString = string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}; Extended Properties=""text;HDR=YES;FMT=Delimited""", fileName); 
OleDbConnection oledbConn = new OleDbConnection(connectionString); 
oledbConn.Open(); 

Il donne l'erreur suivante:

'D:\arrgh\arrgh\Uploads\countrylist.csv' is not a valid path. Make sure that the path name is spelled correctly and that you are connected to the server on which the file resides.

I vérifié que le fichier est là. Que se passe-t-il ici?

Répondre

51

Ok, je creusèrent un peu plus loin et il semble que ma chaîne de connexion est mauvaise. Avec les fichiers CSV, vous ne spécifiez pas le nom du fichier réel mais le répertoire auquel il appartient, par exemple.

var fileName = string.Format("{0}{1}", AppDomain.CurrentDomain.BaseDirectory, "Uploads\\"); 
string connectionString = string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}; Extended Properties=""text;HDR=YES;FMT=Delimited""", fileName); 
OleDbConnection oledbConn = new OleDbConnection(connectionString); 
oledbConn.Open(); 
var cmd = new OleDbCommand("SELECT * FROM [countrylist.csv]", oledbConn); 

Et vous spécifiez le nom de fichier dans SelectCommand. Quelle étrange façon de le faire. Cela fonctionne pour moi maintenant.

+6

Notez également que si vous utilisez le pilote Microsoft Jet OLEDB pour lire des fichiers CSV, vous ne pourrez lire aucun fichier CSV contenant plus d'un point dans son nom de fichier. Autrement dit, "filename.csv" fonctionnera, mais "file.name.csv" ne fonctionnera pas. –

+0

Et notez que vous voulez utiliser 'sql = SELECT * FROM myfile.csv' (c'est-à-dire le nom de fichier sans le chemin). Vous pouvez extraire le nom de fichier du chemin complet en utilisant 'csvFile = Droite (csvPath, Len (csvPath) - InStrRev (csvPath," \ "))' –

+4

@ TommyO'Dell ou simplement 'Path.GetFileName (csvPath)' –

2

La façon de combiner les chemins et les noms de fichiers est d'utiliser:

fullFilename = System.IO.Path.Combine(folderfilepath, Filename); 

dans votre exemple:

var fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Uploads\countrylist.csv"); 
+0

nope, qui ne fonctionne pas aussi bien – sean

+1

@seanlinmt: Ce n'est pas votre seul problème, mais cela est un conseil très judicieux. * Ne jamais * faire des manipulations de chemin comme des chaînes - utilisez toujours les fonctions d'aide 'System.IO.Path'. Sinon, il y aura toujours un cas de bordure qui vous mord. –

0

Si le lecteur D est un lecteur réseau mappé alors vous pouvez besoin d'utiliser le chemin UNC:

\\computerName\shareName\path\ 
1

J'ai eu le même problème il y a quelques semaines à essayer de faire un peu de Bureautique 2007 et a passé trop temps à essayer de le réparer.

string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1;\""; 
4

Je vous recommande d'utiliser un analyseur CSV plutôt que d'utiliser le fournisseur de données OLEDB.

Recherchez et vous trouverez de nombreux candidats (gratuits). Voici quelques-unes qui a fonctionné pour moi:

A portable and efficient generic parser for flat files (plus facile à utiliser, l'OMI)
A Fast CSV Reader (facile à utiliser, idéal pour les grands ensembles de données)
bibliothèque FileHelpers (flexible, comprend des générateurs de code, peu d'apprentissage courbe)

Généralement, ils vous permettent de spécifier les propriétés de votre fichier CSV (délimiteur, en-tête, qualificateur de texte, etc.) et d'appeler un appel de méthode vers une structure de données, telle qu'un DataTable ou Liste <>.

Si vous travaillez avec CSV, cela vaut la peine de consulter un analyseur CSV.

+3

J'ai utilisé le "Fast CSV Reader", c'est génial. –

+1

Bien que je sois d'accord que l'utilisation d'un analyseur CSV est probablement la meilleure solution (voir ma réponse pour une alternative qui est déjà intégrée dans le .NET Framework), il peut y avoir des cas d'utilisation du pilote Microsoft Jet OLEDB. Une propriété utile est de pouvoir détecter les types de données des colonnes CSV, que j'ai déjà utilisées lors de l'écriture de code pour traduire des fichiers CSV dans un format différent (DBF dans mon cas). –

+0

@Daniel - Intéressant à propos du fournisseur OLEDB, je ne le savais pas. Je ne suis pas sûr que je voudrais utiliser cette fonctionnalité, préférant explicitement (et vérifier) ​​ces choses moi-même. Merci pour l'info. –

2

Si vous essayez simplement de lire un fichier CSV avec C#, le plus simple est d'utiliser la classe Microsoft.VisualBasic.FileIO.TextFieldParser. Il est en fait intégré dans le .NET Framework, au lieu d'être une extension tierce.

Oui, c'est dans Microsoft.VisualBasic.dll, mais cela ne signifie pas que vous ne pouvez pas l'utiliser en C# (ou tout autre langage CLR).

Voici un exemple d'utilisation, tirée de la MSDN documentation:

Using MyReader As New _ 
Microsoft.VisualBasic.FileIO.TextFieldParser("C:\testfile.txt") 
    MyReader.TextFieldType = FileIO.FieldType.Delimited 
    MyReader.SetDelimiters(",") 
    Dim currentRow As String() 
    While Not MyReader.EndOfData 
     Try 
     currentRow = MyReader.ReadFields() 
     Dim currentField As String 
     For Each currentField In currentRow 
      MsgBox(currentField) 
     Next 
     Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException 
     MsgBox("Line " & ex.Message & _ 
     "is not valid and will be skipped.") 
     End Try 
    End While 
End Using 

Encore une fois, cet exemple est en VB.NET, mais il serait trivial de le traduire en C#.

Questions connexes