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();
}