2016-04-29 8 views
-1

私はCSVファイルを読み取るプログラムを作成しようとしています。このファイルには、Twitterユーザーからの情報があり、ユーザー名、画面名、ID、リンク、レコード数が含まれています。私はほとんどのツイートでトップ5のユーザーを見つけるために私のプログラムを必要とし、私のコードは以下の通りです:CPPからCSVのトップ10レコードを読む

何らかの理由
string screen_name; 
    string user_class; 
    string user_id; 
    string user_link; 
    int num_records; 

    string str_num_records; 

    getline(stream_s, screen_name, ','); 
    getline(stream_s, user_class, ','); 
    getline(stream_s, user_id, ','); 
    getline(stream_s, user_link, ','); 
    getline(stream_s, str_num_records); 
    string user[5]; 
    int tweets[5]; 
    int top20=0; 


    int req_recs = 750; 
    cout<<"Please be patient as this may take up to 60 seconds"<<endl; 

    while (top20<=4){ 
     if (num_records==req_recs){ 
      //cout << "records = " << str_num_records << endl; 

      stringstream num_records_stream(str_num_records); 
      num_records_stream >> num_records; 
      cout << "User: "<<screen_name<<" has "<<num_records<<" records"<< endl; 
      cout <<"\n\n"; 
       req_recs-=1; 
       top20+=1; 
     } 
     else{ 
      req_recs-=1; 
     } 

    } 

、私はそれを実行するたびに、私は同じレコードごとに単一の時間を作る、と私はしようとすると、私の配列を呼び出すと、ユーザー名の出力が得られず、もう1つの配列のレコード数が大幅に少なくなるか、または大量になります。何か案は?

+0

これは、デバッガの使用方法を学ぶ非常に良い候補です。デバッガを使ってコードをステップ実行し、変数の値を監視するのはStackOverflowへのポストよりもずっと高速です。 –

+0

申し訳ありませんが、使用できるコンパイル可能な例がないため、私はデバッガを使用できません。代わりにデバッガを使用する必要があります。 –

+0

あなたは 'std :: map'を使用して、' std :: map 'のようにユーザの数を数えることができます。 'std :: string'はユーザの名前になり、' int'はそのオカレンスになります。 –

答えて

0

フィールドを保持する構造体の使用をお勧めします。構造体をレコードとしましょう。

struct Record 
{ 
    string screen_name; 
    string user_class; 
    string user_id; 
    string user_link; 
    unsigned int occurrences; 
}; 

std::vectorなどのこれらのレコードのコンテナを使用します。
ファイルからレコードを読み込みます(入力ファイルに問題があるまで)。
同じscreen_nameを持つレコードをコンテナから検索します。
存在する場合は、occurrencesフィールドを増やします。

すべてのレコードが処理されたら、occurrencesフィールドの降順でコンテナをソートします。
最初の5レコードを印刷します。