web-dev-qa-db-fra.com

Analyse de fichiers CSV avec OleDb avec C #

Je sais que ce sujet est fait à mort mais je suis à bout.

J'ai besoin d'analyser un CSV. C'est un assez CSV et la logique d'analyse a été écrite en utilisant OleDB par un autre développeur qui a juré que ça marche avant qu'il ne parte en vacances :)

CSV sample:
Dispatch Date,Master Tape,Master Time Code,Material ID,Channel,Title,Version,Duration,Language,Producer,Edit Date,Packaging,1 st TX,Last TX,Usage,S&P Rating,Comments,Replace,Event TX Date,Alternate Title
,a,b,c,d,e,f,g,h,,i,,j,k,,l,m,,n,

Le problème que j'ai est que je reçois diverses erreurs en fonction de la chaîne de connexion que j'essaie.

quand j'essaye la chaîne de connexion:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source="D:\TEST.csv\";Extended Properties="text;HDR=No;FMT=Delimited"

Je reçois l'erreur:

'D:\TEST.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.

Quand j'essaye la chaîne de connexion:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\TEST.csv;Extended Properties=Excel 12.0;

ou la chaîne de connexion

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\TEST.csv;Extended Properties=Excel 8.0;

Je reçois l'erreur:

External table is not in the expected format.

J'envisage de jeter tout le code et de recommencer à zéro. Y a-t-il quelque chose d'évident que je fais mal?

20
Zulfi Tapia

Vous devez indiquer uniquement le nom du répertoire dans votre chaîne de connexion. Le nom du fichier sera utilisé pour interroger:

var filename = @"c:\work\test.csv";
var connString = string.Format(
    @"Provider=Microsoft.Jet.OleDb.4.0; Data Source={0};Extended Properties=""Text;HDR=YES;FMT=Delimited""", 
    Path.GetDirectoryName(filename)
);
using (var conn = new OleDbConnection(connString))
{
    conn.Open();
    var query = "SELECT * FROM [" + Path.GetFileName(filename) + "]";
    using (var adapter = new OleDbDataAdapter(query, conn))
    {
        var ds = new DataSet("CSV File");
        adapter.Fill(ds);
    }
}

Et au lieu de OleDB, vous pouvez utiliser un analyseur CSV décent (ou un autre ).

37
Darin Dimitrov

Il semble que votre première ligne contienne les noms des colonnes, vous devez donc inclure la propriété HDR = YES, comme ceci:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\TEST.csv;Extended Properties="Excel 12.0;HDR=YES";
0
Edwin de Koning

Essayez la chaîne de connexion:

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\TEST.csv;Extended Properties=\"Excel 8.0;IMEX=1\""
0
davecoulter

Solution alternative http://msdn.Microsoft.com/en-us/library/x710fk43(v=VS.100).aspx

De cette façon, vous n’avez pas à faire appel à un autre développeur parti en vacances. Je l'ai utilisé si souvent et je n'ai rencontré aucun problème.

0
Vijay Gill
 var  s=@"D:\TEST.csv";
 string dir = Path.GetDirectoryName(s);
 string sConnection = "Provider=Microsoft.Jet.OLEDB.4.0;"
                       + "Data Source=\"" + dir + "\\\";"
                       + "Extended Properties=\"text;HDR=YES;FMT=Delimited\"";
0