Question

J'utilise la méthode suivante pour lire le contenu d'un fichier Csv:

    /// <summary>
    /// Reads data from a CSV file to a datatable
    /// </summary>
    /// <param name="filePath">Path to the CSV file</param>
    /// <returns>Datatable filled with data read from the CSV file</returns>
    public DataTable ReadCsv(string filePath)
    {
        if (string.IsNullOrEmpty(filePath))
        {
            log.Error("Invalid CSV file name.");
            return null;
        }

        try
        {
            DataTable dt = new DataTable();

            string folder = FileMngr.Instance.ExtractFileDir(filePath);
            string fileName = FileMngr.Instance.ExtractFileName(filePath);
            string connectionString = 
            string.Concat(@"Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=",
            folder, ";");

            using (OdbcConnection conn = 
                   new System.Data.Odbc.OdbcConnection(connectionString))
            {
                string selectCommand = string.Concat("select * from [", fileName, "]");
                using (OdbcDataAdapter da = new OdbcDataAdapter(selectCommand, conn))
                {
                    da.Fill(dt);
                }
            }

            return dt;
        }
        catch (Exception ex)
        {
            log.Error("Error loading CSV content", ex);
            return null;
        }
    }

Cette méthode fonctionne si j'ai un fichier Csv codé UTF-8 avec un schema.ini qui ressemble à ceci:

[Example.csv]
Format=Delimited(,)
ColNameHeader=True
MaxScanRows=2
CharacterSet=ANSI

Si j'ai des caractères allemands dans un fichier Csv avec le codage Unicode , la méthode ne peut pas lire les données correctement.

Quelles modifications puis-je apporter à la méthode ci-dessus pour lire les fichiers Csv Unicode ? S'il n'y a aucun moyen de le faire de cette façon, quel code de lecture en Csv pouvez-vous suggérer?

Était-ce utile?

La solution

Essayez d’utiliser CharacterSet = UNICODE dans votre fichier schema.ini. Bien que cela ne soit pas documenté sur MSDN , cela fonctionne comme suit sur les forums Microsoft .

Autres conseils

Eh bien, un très bon et bien utilisé lecteur de flux de diffusion CSV se trouve sur CodeProject ; c’est la première chose que j’essayerais… mais il semblerait que votre encodage risque d’être bouleversé, ce qui ne simplifiera peut-être pas la tâche… bien sûr, c’est peut-être tout simplement odbc qui se casse, auquel cas cela pourrait fonctionner bien.

Pour un fichier CSV simple, vous pouvez essayer de l’analyser vous-même ( string.Split etc.), mais il existe suffisamment de cas de contours qu’un analyseur syntaxique de ce type mérite d’être utilisé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top