Domanda

Sto usando il seguente metodo per leggere il contenuto del file 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;
        }
    }

Questo metodo funziona se ho un file CSV codificato UTF-8 con un schema.ini che assomiglia a questo:

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

Se ho caratteri tedeschi in un file CSV con codifica Unicode , il metodo non può leggere correttamente i dati.

Quali modifiche posso apportare al metodo sopra per leggere i file CSV Unicode ? Se non c'è modo di farlo in questo modo, quale codice di lettura CSV puoi suggerire?

È stato utile?

Soluzione

Prova a usare CharacterSet = UNICODE nel tuo file schema.ini. Sebbene questo non sia documentato su MSDN funziona secondo questo thread nei forum di Microsoft .

Altri suggerimenti

Bene, un lettore CSV di streaming molto buono e ben utilizzato è su CodeProject ; questa è la prima cosa che proverei ... ma sembra che la tua codifica potrebbe essere borked, il che potrebbe non renderlo semplice ... ovviamente, potrebbe essere solo odbc che si sta rompendo, nel qual caso quanto sopra potrebbe funzionare multa.

Per un semplice CSV potresti provare ad analizzarlo tu stesso ( string.Split ecc.), ma ci sono abbastanza casi limite che vale la pena usare un parser pre-roll.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top