Microsoft.ACE.OLEDB.12.0 CSV ConnectionString - PullRequest
9 голосов
/ 03 марта 2011

Я знаю, что вопросы такого рода задаются время от времени, но я не могу найти никакого удовлетворительного решения.

Как открыть файл CSV с помощью MS ACE OLEDB 12?Я пытаюсь сделать это с помощью следующего кода.

DbConnection connection = new OleDbConnection();
connection.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Documents;Extended Properties=\"Text;HDR=Yes\"";
connection.Open();
DbCommand cmd;

cmd = connection.CreateCommand();
cmd.CommandText = "SELECT * FROM [Mappe1#csv]";
DbDataReader reader = cmd.ExecuteReader();

while (reader.Read())
{
    for (int i = 0; i < reader.FieldCount; i++)
        Console.Write("(" + reader.GetValue(i).ToString() + ")");

    Console.WriteLine();
}

cmd.Dispose();
connection.Dispose();
Console.WriteLine("Done");
Console.ReadKey();

Проблема в том, что найден только один столбец.Текст ограничен символом «;».Даже когда я указываю разделитель с помощью «Delimited (|)», например, он не будет работать.

Я не могу найти документацию для этого провайдера ...

Ответы [ 3 ]

6 голосов
/ 24 ноября 2011

Это помогло мне получить csv, разделенный точкой с запятой, для анализа в C # с использованием ACE.OLEDB.12.0: http://sqlserverpedia.com/blog/sql-server-bloggers/use-ace-drivers-and-powershell-to-talk-to-text-files/:

Создать текстовый файл schema.ini в том же каталоге, что иCSV-файл, который вы хотите импортировать со следующим содержанием:

[fileIwantToImport.csv]
Format=Delimited(;)
ColNameHeader=True

Работал для меня.Но так отвратительно.

Похоже, FORMAT=Delimited(;) в строке подключения вышло из моды ...

0 голосов
/ 28 февраля 2012

Рассматривали ли вы создание DataSet?

    public static DataSet ConvertTabFiles(string File, string TableName, string delimiter)
    {
        //The DataSet to Return
        DataSet result = new DataSet();

        //Open the file in a stream reader.
        StreamReader s;
        try
        {
            s = new StreamReader(@File);
        }
        catch
        {
            MessageBox.Show("Can't perform operation on file: " + File);
            return result;
        }

        //Split the first line into the columns  
        string[] columns = null;
        try
        {
            columns = s.ReadLine().Split(delimiter.ToCharArray());
        }
        catch
        {
            MessageBox.Show("Can't parse the file " + File + ", please try again!");
            return result;
        }

        //Add the new DataTable to the RecordSet
        result.Tables.Add(TableName);
        //MessageBox.Show("Add the new DataTable to the RecordSet");

        //Cycle the colums, adding those that don't exist yet 
        //and sequencing the one that do.
        foreach (string col in columns)
        {
            bool added = false;
            string next = "";
            int i = 0;
            while (!added)
            {
                //Build the column name and remove any unwanted characters.
                string columnname = col + next;

                //See if the column already exists
                if (!result.Tables[TableName].Columns.Contains(columnname))
                {
                    //if it doesn't then we add it here and mark it as added
                    result.Tables[TableName].Columns.Add(columnname);
                    added = true;
                }
                else
                {
                    //if it did exist then we increment the sequencer and try again.
                    i++;
                    next = "_" + i.ToString();
                }
            }
        }

        //Read the rest of the data in the file.        
        string AllData = s.ReadToEnd();

        string[] rows = AllData.Split("\r\n".ToCharArray());

        //Now add each row to the DataSet        
        foreach (string r in rows)
        {
            //Split the row at the delimiter.
            string[] items = r.Split(delimiter.ToCharArray());
            //Add the item
            result.Tables[TableName].Rows.Add(r);
        }
        //Return the imported data.
        return result;
    }
0 голосов
/ 03 марта 2011

Попробуйте:

connection.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Documents;Extended Properties=\"Text;HDR=Yes;FORMAT=Delimited\"";

(вставка «FORMAT = Delimited» в расширенные свойства строки подключения ...)

...