2011-07-25 19 views
20

Sé que este tema está hecho hasta la muerte, pero estoy al final de ingenio.Analizando CSV usando OleDb usando C#

Necesito analizar un csv. Es un CSV bastante mediocre y la lógica de análisis ha sido escrito usando OleDB por otro desarrollador que juró que funciona antes de que él se fue 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 tengo varios errores dependiendo de la conexión cadena lo intento.

cuando intento 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 intento 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 pensando en tirar todo el código y empezar de cero. ¿Hay algo obvio de que estoy haciendo mal?

Respuesta

33

Debería indicar solo el nombre del directorio en su cadena de conexión. El nombre del archivo se utiliza 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 vez de OleDB Se puede usar un decent CSV parser (o another one).

+0

¡No puedo agradecerte lo suficiente! ¿me puede indicar algunos analizadores csv decentes? Además, ¿dónde puedo leer las cadenas de conexión? es como vudú para mí a partir de ahora. –

+1

@Zulfi Tapia, te he indicado 2 * decentes * analizadores CSV al final de mi respuesta. –

+0

muchas gracias por toda la ayuda! –

0

Parece que su primera fila contiene los nombres de las columnas, por lo que es necesario incluir el HDR = propiedad SÍ, así:

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

sí, la primera columna son encabezados. 'La tabla externa no está en el formato esperado. Todavía –

0

Tratar la cadena de conexión:

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

nopes' La tabla externa no está en el formato esperado. Todavía ... :) –

0
var [email protected]"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

Esto me lleva más allá de los dos errores que he mencionado anteriormente, pero dado que estamos mirando directamente en un directorio, ¿cómo especifico qué archivo recoger? Se bloquea y me dice 'El motor de base de datos Microsoft Jet no pudo encontrar el objeto 'TEST $ .txt'. Asegúrate de que el objeto exista y de que escribas correctamente su nombre y el nombre de ruta. –

Cuestiones relacionadas