我编写了一个解析日志文件的程序。有问题的文件约有一百万条左右,我的目的是按日期删除所有重复的条目。因此,如果日期上有100个唯一的登录,则每个名称只会显示一个登录。我创建的日志输出格式为:
AA 01/Jan/2013
AA 01/Jan 2013
BB 01/Jan 2013
等。整个1月份。
这是我到目前为止所写的内容,for循环中的常量i是要排序的条目数量和namearr& datearr是用于名称和日期的数组。我的最终游戏是在第一个字段中没有与每个日期对应的重复值。我正在努力遵循正确的礼节和协议,所以如果我不喜欢这个问题我会道歉。
我自己解决这个问题的第一个想法是嵌套一个for循环来比较所有以前的名称和日期,但是因为我正在学习数据结构和算法分析,所以我不想爬到高运行时间
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
}
}
}
答案 0 :(得分:1)
Ughhh ...你最好使用正则表达式库来轻松处理文件的大小。检查Boost Regex
http://www.boost.org/doc/libs/1_55_0/libs/regex/doc/html/index.html
答案 1 :(得分:0)
您可以使用简单的字符串连接构造由名称和日期组成的键。该字符串成为地图的索引。在逐行处理文件时,请检查该字符串是否已在地图中。如果是,那么您之前遇到过该名称。如果你已经看到它已经做了一件事,如果它是新的做另一件事。
这是有效的,因为你正在构建一个字符串,只有在该日期已经看到该名称时才能再次找到该字符串并且地图有效地搜索键的空间以查找地图中是否存在某个键