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