Как указать разделитель при импорте CSV-файлов через OLEDB в C#

мне нужно выполнить сложный импорт в Microsoft SQL Server 2000.

поскольку делать это в DTS слишком сложно, я пытаюсь сделать это с помощью небольшой программы C#, но у меня возникают проблемы, когда мне нужно импортировать CSV-файлы: этот файл использует точки с запятой в качестве разделителей полей вместо запятых, и я не могу заставить поставщика OLE DB .NET распознать его.

Я уже нашел различные "решения" в сети, такие как использование Extended Properties="Text; Format=Delimited" или `расширенные свойства="текст; Format=Delimited (;)"in the connection string or using a - схемы.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);
        }
    }
}

есть идеи о том, как добиться использования точки с запятой в качестве разделителя полей, не полагаясь на внешние библиотеки?

Примечания:

  1. бит "не полагаясь на внешние libriaries", потому что мне нужно импортировать файл непосредственно в базу данных, и никакая библиотека, которую я нашел, не может этого сделать (они возвращают строки), и наш PHB не упадет даже пенни за коммерческое решение.
  2. я знаю, что могу импортировать файл через DTS, но мне нужно выполнить сложное ветвление в рабочем процессе и изменениях файлов до и после импорта, и это приведет к прыжкам в и из DTS.
  3. делать все внутри 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);
        }
    }
}

3 ответов


Commenter прав, что у вас неправильный синтаксис поставщика.

однако проблема не в этом. К сожалению, в строке подключения oledb нельзя указать пользовательский разделитель. Вместо этого создайте схему.ini-файл в том же каталоге, что и исходный файл, содержащий следующее:

[file.csv]
Format=Delimited(;)

неуклюжий, но он работает.


схемы.ini-файл должен быть сохранен в Unicode или ANSI, а не как UTF-8.

ваш файл данных также должен быть сохранен как Unicode, а не UTF-8.


вы должны написать свое имя файла csv внутри схемы.ini-файл (не файл.csv], например: тест.csv будет иметь схему.ini с [тест.csv] текст в строке 0:

[test.csv]
Format=Delimited(;)