当前位置: 代码迷 >> QT开发 >> 怎么高效处理文本
  详细解决方案

怎么高效处理文本

热度:321   发布时间:2016-04-25 02:52:39.0
如何高效处理文本
问题:随便举个例子:
原始文本a.txt(汉字+制表符+编码)
的 a
自然 fkie
了 a
虽然 flsp
一 a
但是 flsp
加油 flsp
不 ak

处理后的文本result.txt:
的 a1
自然 fkie
了 a2
虽然 flsp
一 a3
但是 flsp2
加油 flsp3
不 ak1

可以看出来,处理的要求是:
1.在该字编码后面加上它 第几次出现 次数
2.若是四码字且编码唯一,则不需要加上次数

以下是我写的代码:可以实现这一功能,不过效率很低,处理1万以下的文本勉强可行,10万左右的明显卡住不动了。
请各位大神给个建议,多谢了!源代码在这:http://pan.baidu.com/s/1dDqE7oX
分数不多,已经全部献上了。不要嫌弃 。


void Widget::on_button2_clicked()
{
    QTime iTempTime = QTime::currentTime();

    QString bmline="";
    QString strline="";
    QString bm="";
    QString sm=""; //四码自动上屏的编码
    QString newstr="";

    QFile file(ui->lineEdit->text());  //utf-8不带BOM格式
    if (!file.open(QIODevice::ReadOnly))
        return;


    if(file.exists()){


    QByteArray baAll =file.readAll();
    file.close();
    baAll.replace('\r', "");
    QList<QByteArray> lstAll = baAll.split('\n');
    QList<QByteArray>::iterator itr;
    QList<QByteArray> lstOne;
    for (itr = lstAll.begin(); itr != lstAll.end(); ++itr)
    {
        lstOne = itr->split(' ');
        if (lstOne.count() != 2)
            continue;
        m_hshCodes.insert(lstOne.at(0), lstOne.at(1));

        strline = lstOne.at(0);   //读取汉字
        bmline = lstOne.at(1);     //读取编码

        newstr.append(strline+"\t"+bmline);
        bm.append(" "+bmline+" "); //加空格,使如:“ ak ”不属于“ aki ”这个组合
        int s=bm.count(" "+bmline+" ");
        bm.append(QString::number(s)+"\n"); //编码+出现次数


        newstr.append(QString::number(s)+"\n");





        if(bmline.length()==4){

               if(!bm.contains(bmline+" 2")){
                    newstr.replace(bmline+"1",bmline);
                    sm.append(bmline+"\n");
               }else{
                    sm.remove(bmline+"\n");
               }


              }



    }




     QStringList list=sm.split("\n");
     foreach(QString s,list){
              if(s!=""){
                newstr.replace(s+"1",s);
              }

      }




       QFile file2(qApp->applicationDirPath() + "/result.txt");

         if(!file2.open(QIODevice::ReadWrite |QIODevice::Truncate ))
          return;


         QTextStream out(&file2);
         out<<newstr;
         out.flush();
         file.close();

    qDebug() << "load codes takes(s):" << iTempTime.msecsTo(QTime::currentTime());
    QMessageBox::information(this,"提示","转换成功!");



}
}




------解决思路----------------------
你说的不清楚,给的例子也有问题,
比如 出现 多次,第一次出现 是否需要有1
你的a 和 flsp 不一致。
下面的例子是,不会 加 1的。
你自己可以按照你的要求修改一下

相比于你的代码,这个应该比较快。


void Dialog::on_pushButton_2_clicked() {
    QFile file(ui->lineEdit->text());
    QFile file2(qApp->applicationDirPath() + "/result.txt");
    if (!file.open(QIODevice::ReadOnly 
------解决思路----------------------
 QIODevice::Text)) return;
    if (!file2.open(QIODevice::ReadWrite 
------解决思路----------------------
 QIODevice::Text 
------解决思路----------------------
 QIODevice::Truncate)) return;

    QTextStream s1(&file), s2(&file2);

    QHash<QString, int> hash;

    while (!s1.atEnd()) {
        QStringList lineData = s1.readLine().split("\\s+");
        int v = ++hash[lineData[1]];
        QString suffix = v > 1 ? QString("%1").arg(v) : "";
        s2 << QString("%1 %2%3").arg(lineData[0], lineData[1], suffix) << endl;
    }
}
  相关解决方案