C#常用数据解析方法汇总

方法描述,代码在下面:

1.文本文件转表格
2.实体类集合与表格互转
3.类转结构体
4.winform 中 datetable生成文本文件
4. winform 中 datetable生成本地表格
​
​
​
 /// <summary>
        /// TXT转DataTable
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
        public DataTable TXT2DataTable(string path)
        {
            try
            {
                StreamReader sR = File.OpenText(path);
                DataTable dt = new DataTable();
                string firstLine = sR.ReadLine();
                string[] colName = firstLine.Split(',');
                foreach (var i in colName)
                {
                    if (i.Contains("#"))
                    {
                        Regex reg = new Regex(@"[#]");
                        string a = reg.Replace(i, "");
                        DataColumn col = dt.Columns.Add(a.ToString().Trim());
                    }
                    else if(i.Contains("name"))
                    {
                        string a = "Text";
                        DataColumn col = dt.Columns.Add(a.ToString().Trim());
                    }
                    else
                    {
                        DataColumn col = dt.Columns.Add(i.ToString().Trim());
                    }
                }
                string nextLine;
                bool sign = false;
                while ((nextLine = sR.ReadLine()) != null)
                {                   
                    //如果以""开头,舍弃,以"#"开头,以;划分
                    if (nextLine.Equals(""))//txt2中间
                    {
                        continue;
                    }
                    if (nextLine.Equals(" "))//txt2末尾
                    {
                        break;
                    }
                    if (nextLine.StartsWith("#"))
                    {
                        sign = true;
                        continue;                      
                    }
                    char s= sign ? ';' : ',';
                    string[] every_row = nextLine.Split(s);
                    DataRow dr = dt.NewRow();
                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        dr[i] = every_row[i];
                    }
                    dt.Rows.Add(dr);
                }
                sR.Close();
                return dt;
            }
            catch (Exception ex)
            {
                MessageBox.Show("解析错误!", "提示:", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return null;
            }
        }
        /// <summary>
        /// datatable转实体类
        /// </summary>
        /// <typeparam name="T"></typeparam>
            public class ConvertHelper<T> where T : new()
            {
                public static IList<T> ConvertToModel(DataTable dt)
                {
                    IList<T> ts = new List<T>();//定义集合
                    Type type = typeof(T);//获得此模型的类型
                    string tempName = "";
                    //遍历DataTable的所有的行
                    foreach (DataRow dr in dt.Rows)
                    {
                        T t = new T();//获得此模型的公共属性
                        PropertyInfo[] propertys = t.GetType().GetProperties();//定义属性集合
                        foreach (PropertyInfo pi in propertys)//遍历pi的所有的属性
                        {
                            tempName = pi.Name;//将属性名称赋值给临时变量
                            if (dt.Columns.Contains(tempName))//检查DataTable是否包含此列
                            {                           
                                //判断此属性是否有Setter
                                if (!pi.CanWrite)//判断属性是否可写,如果不可写,跳出本次循环
                                    continue;                        
                                object value = dr[tempName];//取值
                                value = Convert.ChangeType(value, pi.PropertyType);//转化数据类型

                                //pi.GetMethods();
                                if (value != DBNull.Value)//如果非空
                                    pi.SetValue(t, value, null);//将值赋到t中
                            }
                        }
                        ts.Add(t);//对象添加到泛型集合中
                    }
                    return ts;
                }
            }
        /// <summary>
        /// 类转结构体
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button4_Click(object sender, EventArgs e)
        {
            MObject _MObject = new MObject(); //可对属性赋值{ A1 = 1, A2 = 2, A3 = 4, C1 = 2.5, C2 = 3.5 };
            MStruct _MStruct = new MStruct();
            //反射 
            #region
            Type type_MObject = _MObject.GetType();
            PropertyInfo[] propertyInfo_MObject = type_MObject.GetProperties();//获取到_MObject的所有属性
            foreach (var item in propertyInfo_MObject)//遍历MObject属性
            {
                //得到MObject中该属性的值,然后去MStruct中设置该属性的值
                object MObject_item_value = item.GetValue(_MObject, null);
                if (MObject_item_value != null)
                {
                    var Obj_MStruct = (object)_MStruct;
                    //得到结构体MStruct中对应字段
                    var fieldsObjinfos = Obj_MStruct.GetType().GetField(item.Name);

                    //判断两个要赋值的属性类型是否相同
                    if (fieldsObjinfos.FieldType == item.PropertyType)
                    {
                        fieldsObjinfos.SetValue(Obj_MStruct, MObject_item_value);
                    }
                    else
                    {
                        //不同的话就做处理
                        //这里处理根据实际情况
                        fieldsObjinfos.SetValue(Obj_MStruct, (MObject_item_value).ToString());
                       // fieldsObjinfos.
                    }
                    //得到结果
                    _MStruct = (MStruct)Obj_MStruct;
                }
            }
            #endregion
        }
        /// <summary>
        /// 泛型集合转DataTable
        /// </summary>
        /// <typeparam name="T">集合类型</typeparam>
        /// <param name="entityList">泛型集合</param>
        /// <returns>DataTable</returns>
        public static DataTable ListToDataTable<T>(IList<T> entityList)
        {
            if (entityList == null) return null;
            DataTable dt = CreateTable<T>();
            Type entityType = typeof(T);
            //PropertyInfo[] properties = entityType.GetProperties();
            PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entityType);
            foreach (T item in entityList)
            {
                DataRow row = dt.NewRow();
                foreach (PropertyDescriptor property in properties)
                {
                    row[property.Name] = property.GetValue(item);
                }
                dt.Rows.Add(row);
            }

            return dt;
        }
        /// <summary>
        /// 生成datatable,以属性名为列名
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        private static DataTable CreateTable<T>()
        {
            Type entityType = typeof(T);
            //PropertyInfo[] properties = entityType.GetProperties();
            PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entityType);
            //生成DataTable的结构
            DataTable dt = new DataTable();
            foreach (PropertyDescriptor prop in properties)
            {
                dt.Columns.Add(prop.Name);
            }
            return dt;
        }
        /// <summary>
        /// 将DataTable导出到Txt文件
        /// </summary>
        /// <param name="dt"></param>eTxt
        public static void ExportExcelFile(DataTable dt)
        {
            //获取配置文件中导出txt文件路径(注:根据自己的实际情况获取路径)
            string strFilePath = "";
            if (!Directory.Exists(strFilePath))
                Directory.CreateDirectory(strFilePath);
            //整合文件名称 文件夹路径+时间文件名称
            string fileFullName = String.Format("{0}{1}.txt", strFilePath, DateTime.Now.Ticks);
            //读取文件信息
            var fi = new FileInfo(fileFullName);
            //判断文件目录是否存在
            if (!fi.Directory.Exists)
            {
                fi.Directory.Create();
            }
            //FileMode.Append(打开文件,流指向文件的末尾,只能与枚举FileAccess.Write联合使用) FileAccess.Write(打开文件,用于只写)
            var fs = new FileStream(fileFullName, FileMode.Append, FileAccess.Write);            //StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.Default);           
                                                                                                 //将字符串写入文件
            var sw = new StreamWriter(fs, Encoding.UTF8);
            var data = "";
            int s = 0;
            //写出列名称     
            if (s == 0)
            {
                ++s;
                for (var i = 0; i < dt.Columns.Count; i++)//先把列名搞出来
                {
                    data += dt.Columns[i].ColumnName;
                    if (i < dt.Columns.Count - 1)//之间添加逗号
                    {
                        data += ",";
                    }
                }
                //写入文件并换行
                sw.WriteLine(data);//后面跟了行结束符
            }

            //写出各行数据       
            for (var i = 0; i < dt.Rows.Count; i++)
            {
                data = "";
                for (var j = 0; j < dt.Columns.Count; j++)
                {
                    var str = dt.Rows[i][j].ToString();
                    //str = str.Replace("\"", "\"\""); //替换英文冒号 英文冒号需要换成两个冒号  
                    //if (str.Contains(',') || str.Contains('"') || str.Contains('\r') || str.Contains('\n')) //含逗号 冒号 换行符的需要放到引号中         
                    //{
                    //    str = string.Format("\"{0}\"", str);
                    //}
                    data += str;
                    if (j < dt.Columns.Count - 1)
                    {
                        data += ",";
                    }
                }
                sw.WriteLine(data);
            }
            sw.Close();
            fs.Close();
        }
        /// <summary>
        /// Datatable生成Excel表格并返回路径
        /// </summary>
        /// <param name="m_DataTable">Datatable</param>
        /// <param name="s_FileName">文件名</param>
        /// <returns></returns>
        public string DataToExcel(DataTable m_DataTable, string s_FileName)
        {
            string FileName = AppDomain.CurrentDomain.BaseDirectory + ("/Upload/Excel/") + s_FileName + ".xls";  //文件存放路径
            if (File.Exists(FileName))                               
            {
                 File.Delete(FileName); //存在则删除
            }
                //FileStream objFileStream;
                //StreamWriter objStreamWriter;//写入流对象
            string strLine = "";
            FileStream objFileStream = new FileStream(FileName, FileMode.OpenOrCreate, FileAccess.Write);
            StreamWriter objStreamWriter = new StreamWriter(objFileStream, Encoding.Unicode);
            for (int i = 0; i < m_DataTable.Columns.Count; i++)
            {
                strLine = strLine + m_DataTable.Columns[i].Caption.ToString() + Convert.ToChar(9);      //写列标题
            }
            objStreamWriter.WriteLine(strLine);
            strLine = "";
            for (int i = 0; i < m_DataTable.Rows.Count; i++)
            {
                for (int j = 0; j < m_DataTable.Columns.Count; j++)
                {
                    if (m_DataTable.Rows[i].ItemArray[j] == null)//没有数据
                        strLine = strLine + " " + Convert.ToChar(9);                                    //写内容
                    else
                    {
                        string rowstr = "";
                        rowstr = m_DataTable.Rows[i].ItemArray[j].ToString();
                        if (rowstr.IndexOf("\r\n") > 0)//换行符的位置
                            rowstr = rowstr.Replace("\r\n", " ");
                        if (rowstr.IndexOf("\t") > 0)//tab键的位置
                            rowstr = rowstr.Replace("\t", " ");
                        strLine = strLine + rowstr + Convert.ToChar(9);
                    }
                }
                objStreamWriter.WriteLine(strLine);
                strLine = "";
            }
            objStreamWriter.Close();
            objFileStream.Close();
            return FileName;        //返回生成文件的绝对路径
        }

​

​

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值