Breaking News
Loading...
22/07/2013

Tự động nhận dạng Code Page

Do yêu cầu công việc, tôi phải xây dựng nhiều SSIS Package load dữ liệu từ nhiều file như .txt, .csv. Có 1 đặc điểm là những file này có Code Page khác nhau.

Do destination là một database với tất cả các column có data type là nvarchar, có những file chứa Unicode thì thuộc tính CodePage là 65001 hoạt động không vấn đề gì. Tuy nhiên có những file chứa ký tự đặc biệt lại có Code Page là 1252, nếu vẫn giữ nguyên 65001 thì sẽ không load được những ký tự này.

Giải pháp đưa ra là trước khi bắt đầu xử lý dữ liệu trong Data Flow, chèn 1 Script Task xử lý để nhận dạng code page, sau đó truyền vô Flat File Connectino Manager.






       public void Main()

        {

            // TODO: Add your code here

            Dts.TaskResult = (int)ScriptResults.Success;



            int codePage=EncodingDetector.GetEncodingCodePage(Dts.Variables["ConnectionStringFile"].Value.ToString());



            if (codePage != 65001)

            {

                codePage = 1252;

            }



            Dts.Variables["CodePage"].Value= codePage;

        }

    }



    public class EncodingDetector

    {

        static bool Compare(byte[] b1, byte[] b2)

        {

            for (int i = 0; i < b1.Length; i++)

            {

                if (b1[i] != b2[i])

                    return false;

            }

            return true;

        }



        public static bool IsEncodedWith(Stream s, Encoding encoding)

        {

            var preamble = encoding.GetPreamble();

            if (preamble == null || preamble.Length == 0)

                return false;



            try

            {

                var buffer = new byte[preamble.Length];

                var count = s.Read(buffer, 0, buffer.Length);

                if (count != buffer.Length)

                    return false;



                return Compare(buffer, preamble);

            }

            finally

            {

                s.Position = 0;

            }

        }



        public static Encoding GetEncoding(string filePath)

        {

            using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))

            {

                if (IsEncodedWith(fs, Encoding.Unicode))

                    return Encoding.Unicode;



                if (IsEncodedWith(fs, Encoding.UTF32))

                    return Encoding.UTF32;



                if (IsEncodedWith(fs, Encoding.UTF8))

                    return Encoding.UTF8;



                if (IsEncodedWith(fs, Encoding.UTF7))

                    return Encoding.UTF7;



                return Encoding.ASCII;

            }

        }





        public static int GetEncodingCodePage(string filePath)

        {

            var en = GetEncoding(filePath);

            return en.CodePage;

        }

    }

0 comments:

Post a Comment

 
Toggle Footer