現在、1 つまたは 2 つのキー フィールドに 10.000.000 を超えるレコードを持つ 2 つのパイプ分割ファイルを結合する C++ 関数を作成しようとしています。
フィールドは次のようになります
P2347|John Doe|C1234
P7634|Peter Parker|D2344
P522|Toni Stark|T288
と
P2347|Bruce Wayne|C1234
P1111|Captain America|D534
P522|Terminator|T288
フィールド 1 と 3 を結合するには、予想される出力が次のように表示されるはずです。
P2347|C1234|John Doe|Bruce Wayne
P522|T288|Toni Stark|Terminator
私が現在考えているのは、セット/配列/ベクトルを使用してファイルを読み取り、次のようなものを作成することです:
P2347|C1234>>John Doe
P522|T288>>Toni Stark
と
P2347|C1234>>Bruce Wayne
P522|T288>>Terminator
次に、スリップの最初の部分をキーとして使用し、それを 2 番目のセット/ベクトル/配列と照合します。
私が現在持っているものは次のとおりです。最初のファイルを読み取り、2 番目のファイルを行ごとにセットと照合します。行全体を取得して一致させます。
#include iostream>
#include fstream>
#include string>
#include set>
#include ctime>
using namespace std;
int main()
{
clock_t startTime = clock();
ifstream inf("test.txt");
set lines;
string line;
for (unsigned int i=1; std::getline(inf,line); ++i)
lines.insert(line);
ifstream inf2("test2.txt");
clock_t midTime = clock();
ofstream outputFile("output.txt");
while (getline(inf2, line))
{
if (lines.find(line) != lines.end())
outputFile > a;
return 0;
}
どんな提案でもとてもうれしいです。また、より良い (より速い) 方法があれば、コンセプト全体を喜んで変更します。1,000 万を超えるレコードが存在する可能性があるため、速度は非常に重要です。
編集:別のアイデアは、マップを取得し、キーをキーにすることです-ただし、これは少し遅くなる可能性があります. 助言がありますか?
助けてくれてありがとう!