zoukankan      html  css  js  c++  java
  • 把QQ聊天记录插入数据库中

    最近在做毕设,其中一个环节是分析qq聊天记录,在分析之前需要先把qq聊天记录导出,然后存入数据库中,qq聊天记录导出后是文本文档,导出方式:
    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;
        }
    
    }

    上面有一处用到了正则表达式,如果只导出与某一个人的聊天记录就没有必要用正则,如果导出的是好几年的群聊,正则就很有必要了。

  • 相关阅读:
    拥有自己的代码生成器—Newlife.XCode模板编写教程
    基于Newlife.XCode的权限系统(含数据集权限)【设计篇】
    拥有自己的代码生成器—NewLife.XCode代码生成器分析
    利用javascript来转换GB2312到UNICONDE &#形式
    和荣笔记 从 Unicode 到 GB2312 转换表制作程式
    如何做SVN迁移
    和荣笔记 GB2312 字符集和编码说明
    asp对象化之:基于adodb.stream的文件操作类
    Unicode 汉字内码表
    微软建议的ASP性能优化28条守则 之三
  • 原文地址:https://www.cnblogs.com/qitian1/p/6461857.html
Copyright © 2011-2022 走看看