Как указать разделитель при импорте файлов CSV через OLEDB в C #
Мне нужно выполнить сложный импорт в Microsoft SQL Server 2000.
Поскольку делать это в DTS слишком сложно, я пытаюсь сделать это с помощью небольшой программы на C #, но у меня возникают проблемы, когда мне нужно импортировать файлы CSV: этот файл использует точки с запятой в качестве разделителей полей вместо запятых и Я не могу заставить поставщика .NET OLE DB распознать его.
Я уже нашел различные "решения" в сети, такие как использованиеExtended Properties="Text; Format=Delimited"
или `` Extended Properties = "Text; Format = Delimited (;)"in the connection string or using a
Файл schema.ini` безрезультатен.
Это фактический код, который я использую:
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);
}
}
}
Любые идеи о том, как добиться использования точки с запятой в качестве разделителя полей, не полагаясь на внешние библиотеки?
Заметки:
Бит «без использования внешних библиотек» объясняется тем, что мне нужно импортировать файл непосредственно в базу данных, и ни одна библиотека, которую я нашел, не может это сделать (они возвращают строки), и наш PHB не упустит ни копейки за коммерческое решение.Я знаю, что могу импортировать файл через DTS, но мне нужно выполнить сложное ветвление рабочего процесса и изменения файла до и после импорта, и это приведет к перепрыгиванию из DTS.Делать все внутри DTS не будет практичнодля меня, поскольку я не настолько квалифицирован в кодировании ActiveX и VBScript.Заранее спасибо, Андреа.
Изменить 1 - @andyb: Код тестовой программы дляschema.ini
подход:
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);
}
}
}