Pregunta

Estoy usando el siguiente método para leer el contenido del archivo 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;
        }
    }

Este método funciona si tengo un archivo Csv codificado UTF-8 con un schema.ini que se parece a esto:

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

Si tengo caracteres alemanes en un archivo Csv con codificación Unicode , el método no puede leer los datos correctamente.

¿Qué modificaciones puedo hacer al método anterior para leer los archivos Csv Unicode ? Si no hay forma de hacerlo de esta manera, ¿qué código de lectura de Csv puede sugerir?

¿Fue útil?

Solución

Intente usar CharacterSet = UNICODE en su archivo schema.ini. Aunque esto no está documentado en MSDN funciona de acuerdo con esto hilo en foros de Microsoft .

Otros consejos

Bueno, un lector CSV de transmisión muy bueno y bien utilizado está en CodeProject ; eso es lo primero que probaría ... pero parece que su codificación puede estar modificada, lo que podría no hacerlo simple ... por supuesto, podría ser odbc que se está rompiendo, en cuyo caso lo anterior podría funcionar bien.

Para CSV simple, puede intentar analizarlo usted mismo ( string.Split etc.), pero hay suficientes casos límite que vale la pena usar un analizador pre-enrollado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top