從"QQ同步助手"上導出的短信文件*.csv中讀取短信,並運用在Qt程序中

        登陸"QQ同步助手"的網頁,我們可以將裏面的短信信息批量導出到本地存爲*.csv文件。該文件可以用Excel打開,看到裏面的短信信息。
        在用Qt編寫一個小程序的時候我想提取這裏面的短信信息。作爲一個小程序來說,不管是用連接數據庫的方式打開該文件,還是使用與平臺相關的ActiveX,或者是使用網上那些開源的類庫都顯得很複雜。我找過一些與平臺無關的類庫,看着裏面那些大量的函數和說明,頭就暈了。
        鑑於CSV文件其實就是一種格式化的文本文件,我就寫了一個類,專門讀取從"QQ同步助手"中導出的CSV格式的短信信息。雖然通用性不強,不過小巧好用,符合自己的習慣:)
        這裏貼出來,業餘水準僅供參考:

        msg.h

#ifndef MSGS_H
#define MSGS_H

#include <QString>
#include <QList>
#include <QFile>
#include <QTextStream>
#include <QDataStream>
#include <iostream>
#include <string>
#include <stdlib.h>
#include <QStringList>
#include <fstream>

class msg{
public:
    msg(){message="";name="";phoneNo="";time="";}

    QString message;
    QString name;
    QString phoneNo;
    QString time;
};

class msgs{
public:
    msgs(){}
    bool csvToNewForm(std::string filename,std::string ofilename); //讀取*.csv文件,做第一步轉換。將短信與短信用特殊符號分割開來,該函數用標準C++編寫
     bool getFmtMsg(QString filename,QString ofilename); //將上一步轉換出的文件讀入,轉換爲QStringList並保存
    bool loadBinMsgs(QString filename);//載入上一步的二進制文件,存入QList<msg> allMsgs中,方便其他程序使用
    bool saveMsgsToBin(QString filename);//將QList<msg> allMsgs中的短信保存爲QStringList,並保存

    QList<msg> allMsgs;
private:
    void help_loadQSL(QStringList &list);
};
#endif // MSGS_H

        msg.cpp

#include"msgs.h"

bool msgs::getFmtMsg(QString filename,QString ofilename){
    QFile file(filename);
    if(!file.open(QIODevice::ReadOnly)){
        //std::cout << "無法打開格式化信息文件" << filename.toStdString() << std::endl;
        return false;
    }
    QTextStream in(&file);
    QString m=in.readAll();
    file.close();

    QStringList list = m.split("№");
    //去除末尾無用空數據
    list.removeLast();
    for(int i=0;i<list.length();i++){
        QString temp=list.at(i);
        while(!temp.isEmpty()&&(temp[0]==QChar('\n')||temp[0]==QChar('\r')))
            temp.remove(0,1);
        while(!temp.isEmpty()&&(temp[temp.length()-1]==QChar('\n')||temp[temp.length()-1]==QChar('\r')))
            temp.remove(temp.length()-1,1);
        list.replace(i,temp);
    }

    QFile outfile(ofilename);
    if(!outfile.open(QIODevice::WriteOnly)){
        //std::cout << "無法創建程序數據文件" << ofilename.toStdString() << std::endl;
        return false;
    }
    QDataStream out(&outfile);
    out << list;
    outfile.close();

    return true;
}
void msgs::help_loadQSL(QStringList &list){
    if(!allMsgs.isEmpty())
        allMsgs.clear();

    msg data;
    for(int i=0;i+3<list.length();i+=4){
        data.message=list.at(i);
        data.name=list.at(i+1);
        data.phoneNo=list.at(i+2);
        data.time=list.at(i+3);
        allMsgs.push_back(data);
    }
}
bool msgs::loadBinMsgs(QString filename){
    QFile file(filename);
    if(!file.open(QIODevice::ReadOnly)){
        //std::cout << "無法載入程序數據文件" << filename.toStdString() << std::endl;
        return false;
    }
    QDataStream in(&file);
    QStringList list;
    in >> list;
    help_loadQSL(list);
    file.close();
    return true;
}
bool msgs::csvToNewForm(std::string filename, std::string ofilename){
    std::fstream file(filename.data(),std::ios::in);
    if(!file){
        //std::cout << "無法打開信息源文件" << filename << std::endl;
        return false;
    }
    char t;
    file.seekg(file.beg);
    //去除第一行,即*.csv文件的表頭
    do{
        file.get(t);
    }while(t!='\n');
    //去除第一句中的首個"號,如果沒有,證明格式錯誤,或文件爲空
    file.get(t);
    if(t!='\"')
        return false;
    //讀取餘下所有內容
    std::string s;
    while(!file.eof()){
        file.get(t);//用get函數可以讀取換行等非顯示字符,用重載的>>就不行
        s.push_back(t);
    }
    file.close();

    //處理讀取進來的內容,將\",\"替換爲№\n。
    std::basic_string <char>::size_type i;
    i = s.find("\",\"",0);
    while (i != std::string::npos ){
        s.replace(i,3,"№\n");
        i=s.find("\",\"",i);
    }
    //將\",\n\"替換爲№\n
    i = s.find("\",\n\"",0);
    while (i != std::string::npos ){
        s.replace(i,4,"№\n");
        i=s.find("\",\n\"",i);
    }
    //處理讀取進來的內容,將文件末尾的\",,替換爲№。
    i=s.find_last_of("\",");
    s.replace(i-1,2,"№");

    //將處理後的內容寫入文件
    std::fstream out(ofilename.data(),std::ios::out);
    if(!out){
        //std::cout << "無法創建格式化信息文件" << ofilename << std::endl;
        return false;
    }
    out << s;

    return true;
}
bool msgs::saveMsgsToBin(QString filename){
    QStringList a;
    for(int i=0;i<allMsgs.length();i++){
        a.push_back(allMsgs.at(i).message);
        a.push_back(allMsgs.at(i).name);
        a.push_back(allMsgs.at(i).phoneNo);
        a.push_back(allMsgs.at(i).time);
    }

    QFile file(filename);
    if(!file.open(QIODevice::WriteOnly)){
        //std::cout << "無法寫入程序數據到" << filename.toStdString() << std::endl;
        return false;
    }
    QDataStream out(&file);
    out<<a;
    file.close();
    return true;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章