10
votes

Microsoft.ace.Oledb.12.0 Connexions CSVR

Je connais des questions Ce type est demandé de temps à autre, mais je ne trouve aucune solution satisfaisante.

Comment puis-je ouvrir un fichier CSV à l'aide de MS ACE OLEDB 12? J'essaie avec le code suivant. P>

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();


1 commentaires

Nous allons de plus en plus d'ACE. Il a beaucoup de problème (presque aucune documentation, aucun support, problèmes de caractères spécifiques dans les noms de données ou de fiche de travail, ...). Nous avons découvert qu'il est plus rapide, plus facile et plus fiable d'utiliser Interop à la place, si vous avez une conception propre que ACE. En plus de CSV Nous utilisons une autre API (Lumenworks CSV Reader: codeProject.com / Articles / 9258 / A-Fast-CSV-Reader )


3 Réponses :


0
votes

Essayez: xxx

(Insertion "Format = délimité" dans les propriétés étendues de la chaîne de connexion ...)


7 commentaires

Nan; pas de changement. J'ai aussi essayé FMT = Tabdelimited (pour un fichier d'onglet).


Difficile de dire alors ... c'est la chaîne de connexion exacte que j'utilise dans mon projet pour lire un CSV et cela fonctionne comme un charme. La seule autre différence serait dans la déclaration SELECT. J'ai "Select * à partir de fichier.csv", spécifiant le nom de fichier directement. Je n'ai pas vu la syntaxe "[mappe1 # csv]" avant - est le nom du fichier "mappe1 # csv" ou est-ce juste un autre moyen de spécifier "mappe1.csv"? J'ai déjà échoué auparavant si l'extension de fichier n'est pas ".csv".


Je vais essayer. mappe1 # csv est le nom qui sera fourni par connexion.getschema ().


Une autre question: quel format a votre dossier? Séparé de;? Newline as \ n et qui codant? J'ai généré le fichier avec Excel Office 2007 ...


Mes fichiers sont délimités par des virgules, en utilisant »comme qualificatif de texte. Pas sûr de l'encodage - probablement UTF-8. Je suis capable de lire des fichiers enregistrés sous forme de CSV d'Excel sans problème.


Je n'ai toujours pas de solution. Actuellement, je n'ai pas le temps de regarder ce problème. Peut-être plus tard...


Le problème ne concerne pas comment importer un fichier texte, c'est comment l'importer avec un délimiteur non-virgule!



7
votes

Cela m'a aidé à obtenir un CSV délimité par semi-fluide à analyser en C # en utilisant Ace.Onedb.12.0: http: //sqlserverpedia.com/blog/sql-server-bloggers/use-ace-Arivers-Trivers-Talk-aTalhell-a-talk-a-text-files/ :

Créer un Schema.ini fichier texte dans le même répertoire que le fichier CSV que vous souhaitez importer avec le contenu suivant: xxx

a travaillé pour moi. Mais donc hucky.

semble que le format = délimité (;;) dans la chaîne de connexion a disparu de la mode ...


0 commentaires

-1
votes

Avez-vous envisagé de créer un jeu de données?

    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;
    }


2 commentaires

Ceci est comme implémenter votre propre lecteur de CSV. Nous utilisons actuellement un autre lecteur de CSV.


Cela échouera sur les données avec des délimiteurs intégrés, par ex. une virgule à l'intérieur de ce qui devrait être un seul champ dans un fichier CSV.