5

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

このメソッドは、次のようなschema.iniを含むUTF-8でエンコードされたCsvファイルがある場合に機能します。

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

UnicodeエンコーディングのCsvファイルにドイツ語の文字が含まれている場合、メソッドはデータを正しく読み取ることができません。

Unicode Csvファイルを読み取るために、上記の方法にどのような変更を加えることができますか?この方法でそれを行う方法がない場合、どのCsv読み取りコードを提案できますか?

4

2 に答える 2

8

CharacterSet=UNICODEschema.ini ファイルで使用してみてください。これはMSDN には記載されていませんが、Microsoft Forums のこのスレッドに従って機能します。

于 2009-01-12T08:07:06.640 に答える
4

非常によく使用されているストリーミングCSVリーダーがCodeProjectにあります。それが私が最初に試みることです...しかし、あなたのエンコーディングが壊れているように聞こえます、それはそれを単純にしないかもしれません...もちろん、それは壊れているodbcである可能性があります、その場合上記はうまくいくかもしれません大丈夫。

単純なCSVの場合は、自分で解析してみることができます(string.Splitなど)が、事前にロールされたパーサーを使用する価値のある十分なエッジケースがあります。

于 2009-01-12T07:40:30.187 に答える