问题:随便举个例子:
原始文本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;
}
}