سؤال

أستخدم الطريقة التالية لقراءة محتوى ملف 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;
        }
    }

هذه الطريقة تعمل إذا كان لدي ترميز UTF-8 ملف Csv مشفر بامتداد schema.ini الذي يبدو مثل هذا:

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

إذا كان لدي أحرف ألمانية في ملف Csv مع يونيكود الترميز، لا يمكن للطريقة قراءة البيانات بشكل صحيح.

ما هي التعديلات التي يمكنني إجراؤها على الطريقة المذكورة أعلاه للقراءة يونيكود ملفات CSV؟إذا لم تكن هناك طريقة للقيام بذلك بهذه الطريقة، فما هو كود قراءة ملف Csv الذي يمكنك اقتراحه؟

هل كانت مفيدة؟

المحلول

وحاول استخدام CharacterSet=UNICODE في ملف Schema.ini الخاص بك. على الرغم من أن هذا ليس موثقة على MSDN أنه يعمل وفقا لهذا <أ href ل = "http://social.microsoft.com/Forums/en-US/vblanguage/thread/0ab1db1a-bfc4-48b6-b31e-33242abf18b2" يختلط = "noreferrer"> موضوع في منتديات Microsoft .

نصائح أخرى

حسنًا، إنه قارئ تدفق CSV جيد جدًا ومستخدم جيدًا موجود على CodeProject;هذا هو أول شيء سأحاول...ولكن يبدو أن التشفير الخاص بك قد يكون معطلاً، وهو ما قد لا يجعل الأمر بسيطًا...بالطبع، يمكن أن يكون فقط odbc هو الذي تعطل، وفي هذه الحالة قد يعمل ما ورد أعلاه بشكل جيد.

بالنسبة لملف CSV البسيط، يمكنك محاولة تحليله بنفسك (string.Split إلخ)، ولكن هناك ما يكفي من حالات الحافة التي يستحق استخدامها المحلل اللغوي المدلفن مسبقًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top