把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;
    }

}

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

时间: 2024-10-15 10:00:57

把QQ聊天记录插入数据库中的相关文章

使用SqlBulkCopy将DataTable中的数据批量插入数据库中

#region 使用SqlBulkCopy将DataTable中的数据批量插入数据库中 /// <summary> /// 注意:DataTable中的列需要与数据库表中的列完全一致. /// </summary> /// <param name="conStr">数据库连接串</param> /// <param name="strTableName">数据库中对应的表名</param> //

把python爬出来的数据,用pymysql插入数据库中

怎么说呢,这个虽然是装逼的产物,但是还是有一定实用价值的. 先说说我看到这只鸡腿的时候,是怎么吃的: 整体内容可以先分为三部分,抓取数据,整理数据,插入到表. 抓取数据: 拿到网址后,进去看了一下需要的数据都在什么位置,结构了解清楚后就可以准备准备开始把他撸出来了. 想要数据当然要先发个请求咯: #定义一个内置浏览器session s = requests.session() url = 'http://www.310win.com/jingcaizuqiu/rangqiushengpingfu

mysql的load data,高速将文本文件,插入数据库中

1语法 LOAD DATA [ LOW_PRIORITY | CONCURRENT ] [ LOCAL ] INFILE 'file_name.txt' [ REPLACE | IGNORE ] INTO TABLE tbl_name [ FIELDS [ TERMINATED BY 'string' ] [ [OPTIONALLY] ENCLOSED BY 'char' ] [ ESCAPED BY 'char'  ] ] [ LINES [ STARTING BY 'string' ] [

PLSQL插入数据库中的中文乱码解决方式

1.查看服务器端编码select userenv('language') from dual;我实际查到的结果为:AMERICAN_AMERICA.AL32UTF82.执行语句 select * from V$NLS_PARAMETERS 查看第一行中PARAMETER项中为NLS_LANGUAGE 对应的VALUE项中是否和第一步得到的值一样.如果不是,需要设置环境变量.否则PLSQL客户端使用的编码和服务器端编码不一致,插入中文时就会出现乱码.3.设置环境变量计算机->属性->高级系统设置

pymysql中如何将动态的插入数据库中

data = { 'id': '1', 'name': 'zengsf', 'age': 20 } table = 'students' #获取到一个以键且为逗号分隔的字符串,返回一个字符串 keys = ', '.join(data.keys()) values = ', '.join(['%s'] * len(data)) sql = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table=table, keys=keys,

.NET中批量给数据库中插入数据

很多时候我们需要把一个txt.xml.excel等文件中的数据插入到数据库中指定的表中.用传统的读取数据构造SQL语句插入性能会很慢(应为要频繁的执行ExectueNonQuery方法),特别是数据量非常大的时候,这个方法不能满足我们的需求,这时微软为我们提供了一个类SqlBulkCopy,能让我们把一个数据块拷贝到指定的数据表中,下面是SQLBulkCopy类使用的一个Demo: 1 #region SqlBullCopy实现,性能很好 2 Stopwatch watch = new Stop

关于使用Log4Net将日志插入oracle数据库中

1.关于配置文件. <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="System.Configuration.IgnoreSectionHandler" /> </configSections> <log4

PHP实例————表单数据插入数据库及数据提取

网站在进行新用户注册时,都会将用户的注册信息存入数据库中,需要的时候再进行提取.今天写了一个简单的实例. 主要完成以下几点功能: (1)用户进行注册,实现密码重复确认,验证码校对功能. (2)注册成功后,将用户进行插入数据库中进行保存. (3)将数据库表中数据进行提取,并打印. 1.注册表单 在以前的几篇博客中,分享过注册及登录表单的代码.这次的代码,大致相同,只是略有变化.仅作为实例探讨 <html> <head> <title>注册页面</title>

SQL SERVER 使用BULK Insert将txt文件中的数据批量插入表中(1)

1/首先建立数据表 CREATE TABLE BasicMsg( RecvTime FLOAT NOT NULL , --接收时间,不存在时间相同的数据 AA INT NOT NULL, --24位地址码 . FlightID Varchar(10) NULL, --航班号) 2/ 建立存储过程 USE DF17DataProIF EXISTS (SELECT * FROM SYS.PROCEDURES WHERE OBJECT_ID = OBJECT_ID(N'[DBO].[BulkDataP