2010-06-24 40 views
6

necesito para realizar una importación compleja en un Microsoft SQL Server 2000.Cómo especificar el delimitador al importar archivos CSV a través de OLEDB en C#

Desde hacerlo de una DTS es demasiado complicado, yo estoy tratando de hacer con un pequeño programa C#, pero estoy teniendo problemas cuando necesito importar un archivo CSV: este archivo usa punto y coma como delimitadores de campo en lugar de comas y no puedo obtener que el proveedor OLE DB de .NET lo reconozca.

Ya encontré varias "soluciones" en la red como usar Extended Properties="Text; Format=Delimited" o `` Propiedades extendidas = "Texto; Formato = Delimitado (;)" in the connection string or using a schema.ini` archivo en vano.

Este es el código real que estoy usando:

DataTable Table = new DataTable(); 

using (OleDbConnection Connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}; Extended Properties=\"Text;HDR=Yes;Format=Delimited\"")) 
{ 
    Connection.Open(); 

    using (OleDbCommand Command = Connection.CreateCommand()) 
    { 
     Command.CommandText = "select [Field 1], [Field 2] from [file.csv]"; 

     using (OleDbDataAdapter Adapter = new OleDbDataAdapter(Command)) 
     { 
      Adapter.Fill(Table); 
     } 
    } 
} 

using (SqlConnection Connection = new SqlConnection("Data Source=server; Initial Catalog=database; User Id=user; Password=password;")) 
{ 
    Connection.Open(); 

    using (SqlCommand Command = Connection.CreateCommand()) 
    { 
     Command.CommandText = "insert into [table] ([field_1], [field_2], ...) values (@field_1, @field_2, ...)"; 

     Command.Parameters.Add("field_1", SqlDbType.Date, 0, "Field 1"); 
     Command.Parameters.Add("field_2", SqlDbType.VarChar, 100, "Field 2"); 
     ... 

     using (SqlDataAdapter Adapter = new SqlDataAdapter()) 
     { 
      Adapter.InsertCommand = Command; 

      Adapter.Update(Table); 
     } 
    } 
} 

Cualquier ideas sobre cómo lograr usando el punto y coma como separador de campo sin depender de libriaries externos?

Notas:

  1. El "sin depender de libriaries externos" bit es porque necesito para importar el archivo directamente en la base de datos y ninguna biblioteca encontré puede hacer esto (que devuelven cadenas), y nuestro PHB no bajará ni un centavo por una solución comercial.
  2. Sé que puedo importar el archivo a través de un DTS, pero necesito realizar una bifurcación compleja en el flujo de trabajo y las modificaciones de archivos antes y después de la importación, y eso daría como resultado saltar dentro y fuera del DTS.
  3. Hacer todo lo que esté dentro del DTS no sería práctico para mí, ya que no soy tan hábil en la codificación de ActiveX y VBScript.

Gracias de antemano, Andrea.

Edición 1 - @andyb: código de programa de prueba para schema.ini enfoque:

String ConnectionString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}; Extended Properties=\"Text\"", Environment.CurrentDirectory); 

DataTable Table = new DataTable(); 

using (OleDbConnection Connection = new OleDbConnection(ConnectionString)) 
{ 
    Connection.Open(); 

    using (OleDbCommand Command = Connection.CreateCommand()) 
    { 
     Command.CommandText = "select * from [file.csv]"; 

     using (OleDbDataAdapter Adapter = new OleDbDataAdapter(Command)) 
     { 
      Adapter.Fill(Table); 
     } 
    } 
} 
+0

Su código utiliza la sintaxis del proveedor de SQL para la cadena OleDbConnection y la sintaxis del proveedor OLE DB dentro de la cadena SqlConnection. ¿Este podría ser el problema? –

+0

@Panagiotis Kanavos: Error de cortar y pegar, corregido. – Albireo

Respuesta

12

comentarista que es correcto que usted tiene su sintaxis proveedor al revés.

Sin embargo, este no es el problema. Desafortunadamente, no puede especificar un delimitador personalizado en su cadena de conexión oledb. En su lugar, crear un archivo schema.ini en el mismo directorio que el archivo de origen que contiene lo siguiente:

[file.csv] 
Format=Delimited(;) 

torpe, pero funciona.

+0

Hola, ya he probado el enfoque 'schema.ini', pero no funciona, todavía obtengo la importación de una columna. Puede encontrar el código que utilizo en un nuevo programa de prueba en el cuerpo de la pregunta editada. – Albireo

+0

Acabo de copiar y pegar el código y he consultado el DataTable y todavía funciona para mí. Perdón por preguntar esto, pero ¿tiene el nombre de archivo correcto en schema.ini? – andyb

+0

Sí, lo comprobé dos veces y está bien. ¿Podría ser que algo esté interfiriendo con esto? : \ – Albireo

5

El archivo schema.ini debe guardarse en Unicode o ANSI, no como UTF-8.

Su archivo de datos también se debe guardar como Unicode no UTF-8.

1

usted tiene que escribir el nombre del archivo CSV dentro del archivo schema.ini (no [file.csv], por ejemplo: test.csv tendrá un schema.ini con el texto [test.csv] en la línea 0:

[test.csv] 
Format=Delimited(;) 
Cuestiones relacionadas