zoukankan      html  css  js  c++  java
  • 实现日志文件直接导入数据库

    现在我要实现一个功能,把日志文件直接导入到数据库,搜索了一下资料,实现了这功能,现在写一个小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("操作失败!");

    四、功能基本实现了

  • 相关阅读:
    索引覆盖与覆盖索引的深入探究
    附加数据库后,数据库状态为只读
    Starting MySQL. ERROR! The server quit without updating PID file(xxx/x.pid)
    【1.4】shell基本实践——根据文件做交互选择
    mysql中count与null的坑
    深入理解yield(二):yield与协程
    深入理解yield(三):yield与基于Tornado的异步回调
    tornado.gen 模块解析
    pip 安装指定版本的python包
    [转]Tornado get/post请求异步处理框架分析
  • 原文地址:https://www.cnblogs.com/zhangjd/p/5676408.html
Copyright © 2011-2022 走看看