c#實現根據有規律的檔案內容解析成實體類

來源:互聯網
上載者:User

標題太難起了。這個功能的由來就是有的時候我們會根據外部的檔案,將檔案中的資料按要求匯入到資料庫中。在本人最近幾個月的工作中至少碰到三次了(一次xml檔案,一次文字檔,這一次是csv格式的),xml檔案的操作比較容易(您可以參考筆者之前的這一篇),對於txt或者csv等格式的檔案覺得有必要寫一個通用的方法,實現檔案內容的快速有效解析。下面記錄一下這個方法,您可以根據自己的需要適當修改成自己想要的形式。
1、讀入檔案

代碼

        private const string fileType = "csv";
        /// <summary>
        /// 從fileupload控制項中讀出檔案內容(csv,txt等格式)
        /// </summary>
        /// <param name="txtFileName"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        public static string GetFileContent(string fileName, byte[] data)
        {
            string fileContent = string.Empty;
            string[] strArr = fileName.Split('.');
            if (string.Compare(strArr[strArr.Length - 1].ToUpper(), fileType.ToUpper()) != 0)
            {
                throw new FormatException("必須是(." + fileType + ")格式的檔案");
            }
            else
            {
                try
                {
                    fileContent = System.Text.Encoding.GetEncoding("GB2312").GetString(data, 0, data.Length); //位元組轉化為字串 
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            return fileContent;
        }

 2、解析檔案成實體

代碼

    public static IList<T> ConvertFile2Model<T>(IList<IList<string>> listStr, IList<string> listProperty) where T : class, new()
        {
            IList<T> listModel = new List<T>();
            //通過反射 顯示要顯示的列
            BindingFlags bf = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static;//反射標識
            T model = default(T);
            Type objType = typeof(T);
            PropertyInfo[] propInfoArr = objType.GetProperties(bf);
            foreach (IList<string> listItem in listStr)
            {
                model = new T();
                int len = listItem.Count;
                if (listProperty.Count != len)
                {
                    throw new Exception("屬性和要解析的列數量不等");
                }
                for (int i = 0; i < len; i++)
                {
                    string property = listProperty[i];
                    foreach (PropertyInfo item in propInfoArr)
                    {
                        if (string.Compare(property.Trim().ToUpper(), item.Name.ToUpper()) == 0)
                        {
                            item.SetValue(model, listItem[i], null);
                            break;
                        }
                    }
                }
                listModel.Add(model);
            }
            return listModel;
        }

 在上面的方法中,我們還需要用到兩個輔助方法,貼出來:
(1)擷取實體屬性

代碼

        public static IList<string> CreateModelProperty<T>() where T : class, new()
        {
            IList<string> listProperty = new List<string>();
            BindingFlags bf = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static;//反射標識
            Type objType = typeof(T);
            PropertyInfo[] propInfoArr = objType.GetProperties(bf);
            foreach (PropertyInfo item in propInfoArr)
            {
                listProperty.Add(item.Name);
            }
            return listProperty;
        }

 (2)、解析檔案內容成特定的形式

代碼

        public static IList<IList<string>> CreateFileContentArr(string fileContent)
        {
            IList<IList<string>> listStr = new List<IList<string>>();
            if (!string.IsNullOrEmpty(fileContent))
            {
                fileContent = fileContent.Trim();
                string[] strArr = fileContent.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);//分行符號  一行記錄對應一個實體記錄
                foreach (string item in strArr)
                {
                    IList<string> listChild = new List<string>();
                    string[] strChildren = item.Split(',');//以逗號,分隔  可以是其他類型的符號,看具體需要
                    foreach (string strItem in strChildren)
                    {
                        listChild.Add(strItem);
                    }
                    listStr.Add(listChild);
                }
            }
            return listStr;
        }

ps: 解析檔案成特定的形式,是按照給出的檔案自訂解析。您可以抽象出變化點(比如分隔字元等),讓它更加通用。樣本中我是按照手頭的項目需要解析的,懶人一個,不費事了,不打醬油打麻將去也。
demo下載:demo

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.