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

标题太难起了。这个功能的由来就是有的时候我们会根据外部的文件,将文件中的数据按要求导入到数据库中。在本人最近几个月的工作中至少碰到三次了(一次xml文件,一次文本文件,这一次是csv格式的),xml文件的操作比较容易(您可以参考笔者之前的这一篇),对于txt或者csv等格式的文件觉得有必要写一个通用的方法,实现文件内容的快速有效的解析。下面记录一下这个方法,您可以根据自己的需要适当修改成自己想要的形式。
1、读入文件

ExpandedBlockStart.gif 代码
         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、解析文件成实体

ExpandedBlockStart.gif 代码
     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)获取实体属性

ExpandedBlockStart.gif 代码
         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)、解析文件内容成特定的形式

ExpandedBlockStart.gif 代码
         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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值