Как указать разделитель при импорте файлов CSV через OLEDB в C # - PullRequest
6 голосов
/ 24 июня 2010

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

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

Я уже нашел различные "решения"в сети, например, используя Extended Properties="Text; Format=Delimited" или` `Extended Properties =" Text; Format = Delimited (;) "in the connection string or using a schema.ini`, но безрезультатно.

Это фактический код I 'используя:

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. "без использования внешних библиотек », потому что мне нужно импортировать файл непосредственно в базу данных, и никакая библиотека, которую я нашел, не может этого сделать (они возвращают строки), и наш 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 ]

12 голосов
/ 24 июня 2010

Комментатор прав, что у вас неверный синтаксис провайдера.

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

[file.csv]
Format=Delimited(;)

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

5 голосов
/ 18 августа 2011

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

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

1 голос
/ 20 февраля 2014

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

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