请问如何用c或c++对几十万行文本进行排序、删除重复行?
方法有不少:
1-导入数据库,排序、删除重复行,输出;
2-用工具软件,如UE;
3-在linux下先sort后uniq;
但是现在需要集成到自己的程序里,希望大家能给出较详细的代码例子,谢谢!
[解决办法]
数据太多,导入数据库比较快 ...
[解决办法]
代码例子么 ...
[解决办法]
和别的程序接口太麻烦……
同样的功能我可能一天需要用几十次。所以最好还是集成到自己的程序里,这样点一下按钮就搞定。
[解决办法]
一天需要用几十次
这种频度要求,用脚本是最方便的。
[解决办法]
导入数据库吧,这些排序,删除重复行的事情要数据库帮你去做吧
[解决办法]
不嫌麻烦的话!!一行一行的看,在删除!!嘿嘿
[解决办法]
Excel的CSV格式文件就是文本,用“,”或“ ”分隔。
如果不编程的话,用Excel或Access导入文件然后排序就行了
[解决办法]
不知怎么搞的一帖出来,漂亮的缩格就没有了……(解决方法是:把代码拷到VC里,选中,Alt+F8)
[解决办法]
MS的数据库引擎比如ADO可以操作文本文件的,.txt,.csv都可以用select执行。写好SQL语句用ADO执行就是了
[解决办法]
用std::sort就可以了,一个很普通的排序,几十万行也不是很大,几秒种应该就可以搞定。
[解决办法]
不错~~
[解决办法]
mark
[解决办法]
#include <vector>
#include <fstream>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
#define LARGENUMBER 6293815
class CHashString
{
public:
CHashString(){ InitHash(); }
void InitHash()
{
index = 1;
sum = 0;
multiple = LARGENUMBER;
}
unsigned long ConsumeChar( char c )
{
sum+=multiple*index++*c;
multiple*=LARGENUMBER;
return sum;
}
unsigned long GetCurSum(){ return sum; }
public:
int index;
unsigned long sum;
unsigned long multiple;
};
typedef vector <pair <char*, unsigned long> > StringIndex;//first 是指针,second是hash值
class CreateStringIndex
{
public:
CreateStringIndex():buffer(NULL){}
~CreateStringIndex(){ delete []buffer; }
StringIndex & GetStringIndex(){ return index; }
bool Create(const char *pFileName )
{
size_t pInd=0;
CHashString hashString;
StringIndex::value_type temp;
ifstream infile( pFileName, ios::binary);
if( infile.fail() ){
return false;
}
infile.seekg(0,ios::end);
length=infile.tellg();
infile.seekg(0,ios::beg);
delete []buffer;
buffer = new char[length+1];
istreambuf_iterator <char> it(infile);
istreambuf_iterator <char> ed;
while( pInd < length )
{
if( *it == '\r ' || *it == '\n ' )
{
buffer[pInd++]=0;
++it;
if( temp.first )
{
temp.second = hashString.GetCurSum();
index.push_back( temp );
}
hashString.InitHash();
temp.first = NULL;
}else
{
hashString.ConsumeChar( *it );
if( temp.first== NULL )
{
temp.first = &buffer[pInd];
}
buffer[pInd++] = *it++;
}
}
if( temp.first ){//如果文件末尾不是以\n结束的
buffer[pInd]=0;
temp.second = hashString.GetCurSum();
index.push_back( temp );
}
return true;
}
private:
char *buffer;
size_t length;
StringIndex index;
};
bool pr1( const StringIndex::value_type &l, const StringIndex::value_type &r )
{
if( l.second == r.second )
{
return (strcmp(l.first, r.first ) <0);
}else
{
return l.second <r.second;
}
}
int main()
{
CreateStringIndex createIndex;
if( !createIndex.Create( "test.txt ") ){return 0;}
StringIndex &index = createIndex.GetStringIndex();
sort(index.begin(),index.end(),pr1);
index.erase(unique(index.begin(),index.end(),pr1),index.end());
for( StringIndex::iterator it = index.begin(); it!=index.end(); it++ ){
cout < <it-> first < <endl;
}
return 0;
}
[解决办法]
上面错了,请增加一个
bool pr2( const StringIndex::value_type &l, const StringIndex::value_type &r )
{
if( l.second!=r.second ){ return false; }
if( strcmp(l.first, r.first )==0 ){return true;}
return false;
}
并且将index.erase(unique(index.begin(),index.end(),pr1),index.end());改成
index.erase(unique(index.begin(),index.end(),pr2),index.end());
[解决办法]
用范型sort 和unique 应该比较简单吧
[解决办法]
推荐直接用sort
或者使用脚本,省时,省下的时间可以用来陪MM。
何乐而不为呢?
[解决办法]
晕的
[解决办法]
用C/C++还是导入数据库比较容易处理
[解决办法]
用脚本。比较EASY。
[解决办法]
用hash吧
Google他们就是用这样的方式来删除重复网址的吧
如果仅仅用hash似乎不能排序哎
可以做个参考:
http://blog.csdn.net/jiju8484/archive/2008/03/01/2137499.aspx