Analizando CSV usando OleDb usando C#
parsing oledbconnection (5)
Sé que este tema está hecho hasta la muerte, pero estoy al final.
Necesito analizar un csv. Es un CSV bastante promedio y la lógica de análisis ha sido escrita usando OleDB por otro desarrollador que juró que funcionaría antes de irse de vacaciones :)
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,
El problema que tengo es que recibo varios errores dependiendo de la cadena de conexión que intento.
cuando pruebo la cadena de conexión:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source="D:/TEST.csv/";Extended Properties="text;HDR=No;FMT=Delimited"
Me sale el error:
''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.
Cuando pruebo la cadena de conexión:
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:/TEST.csv;Extended Properties=Excel 12.0;
o la cadena de conexión
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/TEST.csv;Extended Properties=Excel 8.0;
Me sale el error:
External table is not in the expected format.
Estoy considerando descartar todo el código y comenzar de cero. ¿Hay algo obvio de que estoy haciendo mal?
Debería indicar solo el nombre del directorio en su cadena de conexión. El nombre del archivo se usará 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);
}
}
Y en lugar de OleDB, podrías usar un analizador decente de CSV (u otro ).
Parece que su primera fila contiene los nombres de las columnas, por lo que debe incluir la propiedad HDR = YES, como esta:
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:/TEST.csv;Extended Properties="Excel 12.0;HDR=YES";
Pruebe la cadena de conexión:
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/TEST.csv;Extended Properties=/"Excel 8.0;IMEX=1/""
Solución alternativa http://msdn.microsoft.com/en-us/library/x710fk43(v=VS.100).aspx
De esta manera, no tiene que depender de otro desarrollador que se haya ido de vacaciones. Lo he usado muchas veces y no he encontrado ningún inconveniente.
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/"";