Pergunta

Eu estou usando o método a seguir para ler o conteúdo do arquivo 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 se eu tiver um UTF-8 arquivo CSV codificado com um schema.ini , que é algo como isto:

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

Se eu tiver caracteres alemães em um arquivo CSV com Unicode codificação, o método não pode ler os dados corretamente.

Que modificações posso fazer com o método acima para ler Unicode arquivos CSV? Se não houver nenhuma maneira de fazê-lo desta maneira, o código CSV leitura pode sugerir?

Foi útil?

Solução

Tente usar CharacterSet=UNICODE em seu arquivo schema.ini. Embora este não é documentado no MSDN funciona de acordo com este linha no Microsoft Fóruns .

Outras dicas

Bem, um muito bom e bem utilizado leitor CSV streaming de está em CodeProject ; que é a primeira coisa que eu tentaria ... mas parece que a codificação pode ser borked, que pode não torná-lo simples ... é claro, pode ser apenas ODBC que está quebrando, no caso do trabalho poder acima do qual bem.

Para simples CSV Você poderia tentar analisá-lo você mesmo (string.Split etc), mas existem suficientes borda casos que um analisador de pré-rolou vale a pena usar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top