在日志文件C 中删除重复条目

Deleting duplicate entries in a log file C++

本文关键字:删除 日志 文件      更新时间:2023-10-16

我已经写了一个程序来通过日志文件解析。有问题的文件约为一百万个条目,我的目的是按日期删除所有重复条目。因此,如果日期有100个唯一的登录,则每个名称只会显示一个登录。我创建的日志输出是:

AA 01/Jan/2013
AA 01/Jan 2013
BB 01/Jan 2013

等。等等,整个月。


这是我到目前为止写的,for循环中的常数i是要通过和namearr&DateArr是用于名称和日期的数组。我的最终游戏是在每个日期对应的第一个字段中没有重复值。我正在尝试遵循适当的礼节和协议,因此,如果我不在这个问题上,我深表歉意。

我第一个想法解决这个问题是嵌套循环以将所有以前的名称与日期进行比较,但是由于我正在学习数据结构和算法分析,因此我不想爬到高运行时间。

if(inFile.is_open())
{
for(int a=0;a<i;a++)
{       
    inFile>>name;//Take input file name
    namearr[a]=name;//Store file name into array
    //If names are duplicates, erase them
    if(namearr[a]==temp)
    {
        inFile.ignore(1000,'n');//If duplicate, skip to next line
    }
    else
    {           
    temp=name;
    inFile.ignore(1,' ');
    inFile>>date;//Store date
    datearr[a]=date;//Put date into array
    inFile.ignore(1000,'n');//Skip to next like
    cout<<namearr[a]<<" "<<datearr[a]<<endl;//Output code to window
    oFile<<namearr[a]<<" "<<datearr[a]<<endl;//Output code to file
    }           
}
}

ughhh ...您最好使用正则表达式库来轻松处理文件的大小。检查Boost Regex

http://www.boost.org/doc/libs/1_55_0/libs/regex/doc/html/index.html

您可以构造由名称和简单字符串串联的日期组成的键。该字符串成为地图的索引。当您逐行处理文件时,请检查该字符串是否已经在地图中。如果是这样,那么您前一天就遇到了名字。如果您已经看到它已经做了一件事,如果是新事物,请做另一件事。

这是有效的。