• c#实现根据有规律的文件内容解析成实体类


    标题太难起了。这个功能的由来就是有的时候我们会根据外部的文件,将文件中的数据按要求导入到数据库中。在本人最近几个月的工作中至少碰到三次了(一次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 : classnew()
            {
                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 : classnew()
            {
                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


    作者:Jeff Wong
    出处:http://jeffwongishandsome.cnblogs.com/
    本文版权归作者和博客园共有,欢迎围观转载。转载时请您务必在文章明显位置给出原文链接,谢谢您的合作。

  • 相关阅读:
    Reverse Linked List(算法)
    Move Zeroes (算法)
    Majority Element (算法)
    apk资源文件解析异常导致无法发编译的几种情况及解决方案
    使用update包更新系统文件的过程
    听鬼哥说故事之安卓学习手册_研究过程记录(未完成...)
    ios arm64
    ios,新浪微博
    ios ,微信分享
    ios,qq分享
  • 原文地址:https://www.cnblogs.com/jeffwongishandsome/p/1622447.html
Copyright © 2020-2023  润新知