Parsing 如何检测文本文件中的重复模式
为了简化具有多个术语的函数,可以使用一个程序来搜索文件中的模式并将其排列在排名列表中。我可以想象,这是一个复杂的过程,但我相信有人已经建立了这样的东西。 文本示例:Parsing 如何检测文本文件中的重复模式,parsing,text-files,Parsing,Text Files,为了简化具有多个术语的函数,可以使用一个程序来搜索文件中的模式并将其排列在排名列表中。我可以想象,这是一个复杂的过程,但我相信有人已经建立了这样的东西。 文本示例: sin(t1)*cos(t1)*t1+t1-sin(t1)*sin(t1-pi) 这应该给我这样的输出(至少2个字母): 这个问题有名字吗(我不知道)?有没有一个已知的算法可以帮我解决这个问题?我用QT编写了一个小程序,完成了这个任务。方法是尝试一切。要解决我的问题,可能需要几天时间,因为文本文件非常大。 如果输入以下文本(“te
sin(t1)*cos(t1)*t1+t1-sin(t1)*sin(t1-pi)
这应该给我这样的输出(至少2个字母):
这个问题有名字吗(我不知道)?有没有一个已知的算法可以帮我解决这个问题?我用QT编写了一个小程序,完成了这个任务。方法是尝试一切。要解决我的问题,可能需要几天时间,因为文本文件非常大。 如果输入以下文本(“text.txt”): 我有两个参数:长度2-5,最小出现次数:3 结果如下:
t1 6
(t 4
(t1 4
si 3
in 3
n( 3
1) 3
)* 3
sin 3
in( 3
n(t 3
t1) 3
1)* 3
sin( 3
in(t 3
n(t1 3
(t1) 3
t1)* 3
sin(t 3
in(t1 3
(t1)* 3
代码:
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
qcorea应用程序(argc、argv);
QString*wholefile=新的QString;
uint64_t minchar=2;
uint64_t maxchar=5;
uint64最小发生次数=3;
QFile文件(“text.txt”);
如果(!file.open(QIODevice::ReadOnly)){
qDebug()包含(模式)==0){
所有模式->附加(模式);
}
}
}
uint64_t*strcnt=new uint64_t[allpatterns->length();
uint64最大值=0;
QStringList*兴趣模式=新的QStringList;
uint64模式的数量=0;
对于(uint64_t i=0;ilength();i++){
QString str=allpatterns->at(i);
strcnt[n个模式]=整个文件->计数(str);
如果(strcnt[n个模式]>=min\u出现){
if(strcnt[n个图案]>最大值){
最大值=strcnt[n个图案];
}
兴趣模式->附加(str);
nr_的_模式++;
}
}
/*显示结果*/
QFile文件2(“out.txt”);
如果(!file2.open(QIODevice::WriteOnly | QIODevice::Text))
qDebug()位于(i);
qDebug()我认为这不是一个设计模式,设计师模式解决了一个反复出现的问题,这个问题可以用正则表达式解决,一个正确的例子!我选错了日子。希望“模式加工”更合适。thinnk解析是正确的标记。我已经编写了一个程序,现在可以使用以下参数尝试所有选项:最大和最小字符串长度,以及最小出现次数。这是非常低效的,但我认为它现在对我有帮助。我想有比什么都尝试更好的算法。当我测试了我的程序后,我会在论坛上分享我的程序。当你发布你的程序时,给我发送消息,我会看到它
sin(t1)*cos(t1)*t1+t1-sin(t1)*sin(t1-pi)
t1 6
(t 4
(t1 4
si 3
in 3
n( 3
1) 3
)* 3
sin 3
in( 3
n(t 3
t1) 3
1)* 3
sin( 3
in(t 3
n(t1 3
(t1) 3
t1)* 3
sin(t 3
in(t1 3
(t1)* 3
#include <QCoreApplication>
#include <qdebug.h>
#include <qstring.h>
#include <qfile.h>
#include <qtextstream.h>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString * wholefile = new QString;
uint64_t minchar = 2;
uint64_t maxchar = 5;
uint64_t min_occur = 3;
QFile file("text.txt");
if(!file.open(QIODevice::ReadOnly)) {
qDebug()<<"error reading file";
}
QTextStream in(&file);
while(!in.atEnd()) {
QString line = in.readLine();
wholefile->append(line);
}
file.close();
QStringList * allpatterns = new QStringList;
for(uint64_t i=minchar; i<=maxchar;i++){
for(uint64_t pos=0; pos<wholefile->length()-i;pos++){
QString pattern = wholefile->mid(pos,i);
if(allpatterns->contains(pattern)==0){
allpatterns->append(pattern);
}
}
}
uint64_t * strcnt = new uint64_t[allpatterns->length()];
uint64_t maximum_cnt = 0;
QStringList * interestingpatterns = new QStringList;
uint64_t nr_of_patterns = 0;
for(uint64_t i=0; i<allpatterns->length();i++){
QString str = allpatterns->at(i);
strcnt[nr_of_patterns] = wholefile->count(str);
if(strcnt[nr_of_patterns]>=min_occur){
if(strcnt[nr_of_patterns]>maximum_cnt){
maximum_cnt = strcnt[nr_of_patterns];
}
interestingpatterns->append(str);
nr_of_patterns++;
}
}
/* display result*/
QFile file2("out.txt");
if (!file2.open(QIODevice::WriteOnly | QIODevice::Text))
qDebug()<<"error writing file";
QTextStream out(&file2);
uint64_t current_max = maximum_cnt;
while(current_max>=min_occur){
for(uint64_t i=0; i<interestingpatterns->length();i++){
if(strcnt[i]==current_max){
QString str = interestingpatterns->at(i);
qDebug()<<str<<strcnt[i];
out <<str<<" "<< QString::number(strcnt[i])<<"\n";
}
}
current_max--;
}
file2.close();
return a.exec();
}