Cómo especificar el delimitador al importar archivos CSV a través de OLEDB en C #
Necesito realizar una importación compleja en un Microsoft SQL Server 2000.
Dado que hacerlo en un DTS es demasiado complicado, estoy tratando de hacerlo con un pequeño programa C #, pero tengo problemas cuando necesito importar un archivo CSV: este archivo está usando puntos y comas como delimitadores de campo en lugar de comas y No puedo lograr que el proveedor OLE DB de .NET lo reconozca.
Ya encontré varias "soluciones" en la red como usarExtended Properties="Text; Format=Delimited"
o `` Propiedades extendidas = "Texto; Formato = Delimitado (;)"in the connection string or using a
el archivo schema.ini` fue 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);
}
}
}
¿Alguna idea sobre cómo lograr usar el punto y coma como separador de campo sin depender de bibliotecas externas?
Notas:
El bit "sin depender de bibliotecas externas" es porque necesito importar el archivo directamente a la base de datos y ninguna biblioteca que encontré puede hacer esto (devuelven cadenas), y nuestro PHB no arrojará ni un centavo por una solución comercial.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 alteraciones del archivo antes y después de la importación, y eso resultaría en entrar y salir del DTS.Hacer todo dentro del DTS no sería prácticopara mi, ya que no soy tan hábil en la codificación ActiveX y VBScript.Gracias de antemano, Andrea.
Edición 1 - @andyb: Probar el código del programa paraschema.ini
acercarse a, aproximarse:
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);
}
}
}