Analisando o CSV usando o OleDb usando c #

Eu sei que este tópico é feito até a morte, mas eu estou no fim do juízo.

Eu preciso analisar um csv. É um CSV bastante comum e a lógica de análise foi escrita usando o OleDB por outro desenvolvedor que jurou que funcionava antes de sair de férias 🙂

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, 

O problema que tenho é que eu recebo vários erros, dependendo da cadeia de conexão que eu tento.

quando eu tento a string de conexão:

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

Eu recebo o erro:

 '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. 

Quando eu tento a string de conexão:

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

ou a string de conexão

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

Eu recebo o erro:

 External table is not in the expected format. 

Estou pensando em jogar fora todo o código e começar do zero. Existe algo óbvio que estou fazendo errado?

Você deve indicar apenas o nome do diretório em sua string de conexão. O nome do arquivo será usado para consultar:

 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); } } 

E, em vez do OleDB, você poderia usar um analisador de CSV decente (ou outro ).

Parece que sua primeira linha contém os nomes das colunas, então você precisa include a propriedade HDR = YES, desta forma:

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

Experimente a string de conexão:

 "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\TEST.csv;Extended Properties=\"Excel 8.0;IMEX=1\"" 
  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\""; 

Solução alternativa http://msdn.microsoft.com/pt-br/library/x710fk43(v=VS.100).aspx

Dessa forma, você não precisa depender de outro desenvolvedor que tenha ido de férias. Eu o usei tantas vezes e não atingi nenhum obstáculo.