2

ファイルを検索し、データと関連する行番号を提供する次のコードを使用しています。しかし、このコードは数十万行の場合に十分に高速ですか? 私のPCは文字通り数秒間フリーズしました。整数のペアを検索し、コンマの後に RHS 値を返す必要がありますが (いくつかの統計情報)、次のコードを使用すると、行全体を返すことができます。

  1. split関数を使用して返されたデータを解析し、RHS 値を取得することは、高速性の点で良い考えですか?

また

  1. LHS 引数に基づいて RHS 値を直接取得します。(まあ、私はこれを行うことができません)

上記の2つのいずれかを達成するために誰かが私を助けることができますか?

これが私のコードです:

#include <string>
#include <iostream>
#include <fstream>

    int main()
    {
        std::ifstream file( "index_hyper.txt" ) ;
        std::string search_str = "401" ;
        std::string line ;
        int line_number = 0 ;
        while( std::getline( file, line ) )
        {
            ++line_number ;
            if( line.find(search_str) != std::string::npos )
                std::cout << "line " << line_number << ": " << line << '\n' ;
        }
    }

index_hyper.txtファイルの内容は次のとおりです。

18,22
20,37
151,61
200,62
156,63
158,64
159,65
153,66
156,67
152,68
154,69
155,56
156,14
157,13
160,122
161,1333
400,455
401,779
402,74
406,71
4

2 に答える 2

1

上記のコードの作業は、次の方法で実行できます。

grep -n "^401," index_hyper.txt

RHS だけを出力したい場合は、次のことができます。

grep  "^401," index_hyper.txt | sed "s/[^,]*,//"

sed、grep、bash などを使用しない Windows プラットフォームを使用している場合は、cygwinをインストールすることで UNIX ツールに簡単にアクセスできます。

于 2013-10-03T12:33:30.677 に答える
0

原則として、必要になるまで文字列を小さな断片 (部分文字列) に分割し始めないでください。そして、必要なものを正確に指定することから始めます。RHS と LHS について話し、「LHS 引数に基づいて RHS 値を取得する」について話します。つまり、最初のフィールドでの完全一致、最初のフィールドでの部分文字列の一致、または行全体での部分文字列の一致が必要ですか?

いずれにせよ、行をlineに入れたら、簡単に 2 つのフィールドに分けることができます。

std::string::const_iterator pivot = std::find( line.cbegin(), line.cend(), ',' );

次に行うことは、基準が何であるかによって異なります。

if ( pivot - line.cbegin() == search_str.size() &&
        std::equal( line.cbegin(), pivot, search_str.begin() ) ) {
    //  Exact match on first field...
    std::cout << std::string( std::next( pivot ), line.cend() );
}

if ( std::search( line.cbegin(), pivot, search_str.begin(), search_str.end() ) != pivot ) {
    //  Matches substring in first field...
    std::cout << std::string( std::next( pivot ), line.cend() );
}

if ( std::search( line.cbegin(), line.cend(), search_str.begin(), search_str.end() ) != line.cend() ) {
    //  Matches substring in complete line...
    std::cout << std::string( std::next( pivot ), line.end() ); }
}

もちろん、追加のエラー チェックが必要になります。たとえば、行にコンマがない場合 (例: ) はどうすればよいでしょうpivot == line.end()か? または、行の余分なスペースはどうですか。(あなたの例は数字のように見えます。、または?"401"のみに一致する必要があります。)"401""+401"

先に進む前に、考えられるすべての入力に対して、コードが何をすべきかを正確に指定する必要があります。(もちろん、考えられるほとんどの入力に対して、答えはおそらく次のようになります: 行番号を含むエラー メッセージを出力しstd::cerrて続行します。そのような場合は必ず戻るEXIT_FAILUREようにしてください。)

于 2013-10-03T12:59:41.720 に答える