把QQ聊天记录插入数据库中
2015-05-06 15:27
477 查看
最近在做毕设,其中一个环节是分析qq聊天记录,在分析之前需要先把qq聊天记录导出,然后存入数据库中,qq聊天记录导出后是文本文档,导出方式:
1.登录qq后,点击任意一个好友,查看与他的聊天记录,点击聊天记录界面的小喇叭图标。
2.点击小喇叭图标后就可以选择自己要导出的聊天记录了,在要导出的人名或者群名上右键单击,选择导出聊天记录,导出格式为文本文档。
导出的文本文档格式性非常强,看下图:
我们大致分析一下这个格式,最上面那几行说明性的文字直接删去,主要看聊天记录部分,先是日期,然后一个空格,然后是时间,再一个空格,然后是用户名,换行之后就是具体的内容,正常的文档就是这样的格式,没有问题,可是有时候我们发送的qq消息中有换行符,这样的话给我们的导出记录增添了一些复杂性,所以要先对这个文档进行简单的处理。
先说说我的一个整体思路吧,每条记录的第一行,不同信息之间都有一个空格,所以我想把记录的正文内容也放在第一行,就是有时间的那一行,在记录正文和姓名之间加一个空格,这样的话每一行就是一条记录,在读取一行的信息之后,可以使用String自带的函数split(),参数是一个空格将String拆分成一个长度为4的数组。然后遍历数组插入数据库中。
基于这样的思路,我要对文档进行以下处理:
1.删除记录正文中的所有空格,避免在使用split函数时出现不必要的麻烦。对于时间日期那一行的空格则不必删除,这也就说明了这里不能用查找替换来做。
2.正文中可能会存在换行符,这个也要去除。
DBUtil.java
QQChat.java
上面有一处用到了正则表达式,如果只导出与某一个人的聊天记录就没有必要用正则,如果导出的是好几年的群聊,正则就很有必要了。
1.登录qq后,点击任意一个好友,查看与他的聊天记录,点击聊天记录界面的小喇叭图标。
2.点击小喇叭图标后就可以选择自己要导出的聊天记录了,在要导出的人名或者群名上右键单击,选择导出聊天记录,导出格式为文本文档。
导出的文本文档格式性非常强,看下图:
我们大致分析一下这个格式,最上面那几行说明性的文字直接删去,主要看聊天记录部分,先是日期,然后一个空格,然后是时间,再一个空格,然后是用户名,换行之后就是具体的内容,正常的文档就是这样的格式,没有问题,可是有时候我们发送的qq消息中有换行符,这样的话给我们的导出记录增添了一些复杂性,所以要先对这个文档进行简单的处理。
先说说我的一个整体思路吧,每条记录的第一行,不同信息之间都有一个空格,所以我想把记录的正文内容也放在第一行,就是有时间的那一行,在记录正文和姓名之间加一个空格,这样的话每一行就是一条记录,在读取一行的信息之后,可以使用String自带的函数split(),参数是一个空格将String拆分成一个长度为4的数组。然后遍历数组插入数据库中。
基于这样的思路,我要对文档进行以下处理:
1.删除记录正文中的所有空格,避免在使用split函数时出现不必要的麻烦。对于时间日期那一行的空格则不必删除,这也就说明了这里不能用查找替换来做。
2.正文中可能会存在换行符,这个也要去除。
public class R2DB { public static void main(String[] args) { //处理原始文档,处理后的文档存入999.txt中 //处理之前先把文档前面的说明性文字去掉 processTxt(); //读取原始文档并插入数据库 readAndInsert(); } private static void readAndInsert() { String sql = ""; try { File file = new File("F:\\test\\999.txt"); String str = null; BufferedReader br = new BufferedReader(new FileReader(file)); QQChat qqChat = new QQChat(); List<QQChat> list = new ArrayList<QQChat>(); while ((str = br.readLine()) != null) { String[] strs = str.split(" "); qqChat.setQqDate(strs[0]); qqChat.setQqTime(strs[1]); qqChat.setQqUser(strs[2]); /** * 有的消息内容为空,拆分后数组的长度为3,对于这种消息, * 设置它为未知消息 */ if (strs.length==4) { qqChat.setQqContent(strs[3]); }else{ qqChat.setQqContent("未知消息"); } list.add(qqChat); qqChat = new QQChat(); } Connection con = null; PreparedStatement ps = null; con = DBUtil.getConnection(); try { for (QQChat q : list) { sql = "insert into qq_record values(null,'" + q.getQqDate() + "','" + q.getQqTime() + "','" + q.getQqUser() + "','" + q.getQqContent() + "');"; ps = con.prepareStatement(sql); ps.executeUpdate(); } System.out.println("插入成功!"); } catch (SQLException e) { //如果遇到出错的插入语句,则输出,查看问题在哪里,直接解决即可 System.out.println(sql); e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } } private static void processTxt() { try { //原始文档名为hdjg.txt File file = new File("F:\\test\\hdjg.txt"); String str = null; BufferedReader br = new BufferedReader(new FileReader(file)); PrintWriter out = new PrintWriter(new File("F:\\test\\999.txt")); while ((str = br.readLine()) != null) { //这个正则表达式用来匹配2015-02-10 16:02:50 张三 //如果是导出与一个人的聊天记录就不必用正则,但是我要导出的是群聊,所以要用正则 Pattern pattern = Pattern .compile("\\d{4}\\-\\d{2}\\-\\d{2}\\s\\d{2}\\:\\d{2}\\:\\d{2}\\s.+"); Matcher matcher = pattern.matcher(str); if (matcher.matches()) { //每次输出时间姓名那一行之前都先输出一个换行 out.println(); //将有的文本中的两个空格替换成一个 out.print(str.replace(" ", " ")+" "); } else { /** * 将聊天正文中的空格去掉,同时,有的正文中有单引号,这个会导致在数据插入时 * 出现问题,所以把正文中所有的单引号换成双引号 */ out.print(str.replace(" ", "").replace("'", "\"")); } } out.close(); System.out.println("OK!"); } catch (IOException e) { e.printStackTrace(); } } }
DBUtil.java
public class DBUtil { public static Connection getConnection() { String username = "root"; String password = "admin"; String url = "jdbc:mysql://localhost:3306/qqchat"; Connection con = null; try { con = DriverManager.getConnection(url, username, password); } catch (SQLException e) { e.printStackTrace(); } return con; } public static void close(Connection con) { try { if(con!=null) con.close(); } catch (SQLException e) { e.printStackTrace(); } } public static void close(java.sql.PreparedStatement ps) { try { if(ps!=null) ps.close(); } catch (SQLException e) { e.printStackTrace(); } } public static void close(ResultSet rs) { try { if(rs!=null) rs.close(); } catch (SQLException e) { e.printStackTrace(); } } }
QQChat.java
public class QQChat { private String qqDate; private String qqTime; private String qqUser; private String qqContent; public String getQqDate() { return qqDate; } public void setQqDate(String qqDate) { this.qqDate = qqDate; } public String getQqTime() { return qqTime; } public void setQqTime(String qqTime) { this.qqTime = qqTime; } public String getQqUser() { return qqUser; } public void setQqUser(String qqUser) { this.qqUser = qqUser; } public String getQqContent() { return qqContent; } public void setQqContent(String qqContent) { this.qqContent = qqContent; } }
上面有一处用到了正则表达式,如果只导出与某一个人的聊天记录就没有必要用正则,如果导出的是好几年的群聊,正则就很有必要了。
相关文章推荐
- 把QQ聊天记录插入数据库中
- 把QQ聊天记录插入数据库中
- 把QQ聊天记录插入数据库中
- Android如何获取QQ与微信的聊天记录并保存到数据库详解
- QQ导出的txt聊天记录导入数据库方法
- 为什么不能在空数据库中插入记录??经典
- 如何向后台数据库插入多条记录?
- 利用PreparedStatement对象实现在数据库中插入一条记录。
- QQ登录失败,文件读取出错(错误码0x0006000d)保留聊天记录解决办法
- 使用jdbc向数据库中插入多条记录,探究有索引和没有索引的查询速度的代码
- 陌陌聊天记录被删除了,还能恢复吗?QQ1622863529
- 对QQ2010版聊天记录的薄见
- QQ聊天记录分析器
- 记录一下,为什么QQ复制整个文件夹后,仍然没有聊天记录
- 我的文档和QQ聊天记录备份与恢复技巧
- 利用 notepad++快速插入数据库测试记录
- 手机QQ2009(塞班第三版)聊天记录提取完全代码
- 如何导入以前的qq聊天记录
- 导出手机QQ聊天记录到电脑
- Java数据库之插入记录