实现日志文件直接导入数据库

现在我要实现一个功能,把日志文件直接导入到数据库,搜索了一下资料,实现了这功能,现在写一个小Dome。我操作的数据库是SQL Server

一、封装了一个将日志文件读取成List集合的方法

        /// <summary>
        /// 读取文本文件转换为List 
        /// </summary>
        /// <param name="fileName">文件路径</param>
        /// <returns>返回list集合</returns>
        public List<string> ReadTextFileToList(string fileName)
        {
            List<string> list = new List<string>();
            MemoryStream ms = new MemoryStream(File.ReadAllBytes(fileName));
            using (StreamReader sr = new StreamReader(ms, Encoding.GetEncoding("GB2312")))
            {
                try
                {
                    while (sr.Peek() > -1)
                    {
                        string info = sr.ReadLine();
                        list.Add(info);
                    }
                }
                catch (Exception ex) { sr.Close(); throw ex; }
            }
            return list;
        }

二、封装DataTable导入数据库的方法

        /// <summary>
        ///DataTable数据导入数据库 
        /// </summary>
        /// <param name="connStr">导入的数据库连接字符串</param>
        /// <param name="dt">数据源DataTable</param>
        /// <returns></returns>
        public bool InsertData(string connStr, DataTable dt)
        {
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                using (SqlBulkCopy sqlbulkcopy = new SqlBulkCopy(connStr, SqlBulkCopyOptions.UseInternalTransaction))
                {
                    try
                    {
                        //一次批量的插入的数据量 
                        sqlbulkcopy.BatchSize = 10000;
                        sqlbulkcopy.DestinationTableName = "Ratings";//服务器上目标表名称
                        for (int i = 0; i < dt.Columns.Count; i++)
                        {
                            sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);//列映射
                        }
                        sqlbulkcopy.WriteToServer(dt);//批量写入
                        return true;
                    }
                    catch (System.Exception ex)
                    {
                        return false;
                        throw ex;
                    }
                }
            }
        }

三、实现日志文件导入到数据库

            ReadList readList = new ReadList();
            //调用ReadList类里面的ReadTextFileToList方法,实现日志文件转list
            List<string> list = readList.ReadTextFileToList(@"E:BaiduYunDownloaoupeng_requests.2016-04-21T00.uf01-08.log");
            DataTable dt = new DataTable();//构造数据源
            dt.Columns.Add("TIMESTAMP");
            dt.Columns.Add("IP_PORT");
            dt.Columns.Add("OUPENG_UID");
            dt.Columns.Add("IMEI");
            dt.Columns.Add("APPLICATION");
            dt.Columns.Add("APP_SENT_BYTES");
            dt.Columns.Add("APP_RECEIVED_BYTES");
            dt.Columns.Add("HTTP_METHOD");
            dt.Columns.Add("HTTP_STATUS_CODE");
            dt.Columns.Add("URL");
            dt.Columns.Add("USER_AGENT");
            foreach (string item in list)
            {
                item.Trim();//去除前后空格
                string[] strs = item.Split('    ');//我的日志文件字段直接是空格分割的
                DataRow dr = dt.NewRow();//创建数据行
                for (int j = 0; j < strs.Length; j++)
                {
                    //j = 9主要我的日志文件,这个字段太长了,没办法只能截取处理了
                    if (j == 9)
                    {
                        int Length = strs[j].ToString().Length;
                        if (Length < 100)
                        {
                            dr[j] = strs[j].ToString().Substring(0, Length);
                        }
                        else
                            dr[j] = strs[j].ToString().Substring(0, 100);
                    }
                    else
                        dr[j] = strs[j];

                }
                dt.Rows.Add(dr);//将创建的数据行添加到table中
            }
            string connStr = "Data Source=.;Initial Catalog=ReadLog;Integrated Security=True";//数据库连接字符串
            if (InsertData(connStr, dt))//DataTable数据导入数据库 
                MessageBox.Show("操作成功!");
            else
                MessageBox.Show("操作失败!");

四、功能基本实现了

原文地址:https://www.cnblogs.com/zhangjd/p/5676408.html