1

これは前にも出たことがあるかもしれませんが、フォーマットされたデータを抽出する方法がわかりませんでした。以下は、テキスト ファイル内の文字列 "[87]" と "[90]" の間のすべてのテキストを抽出するコードです。

どうやら、[87] と [90] の位置は、出力に示されているものと同じです。

void ExtractWebContent::filterContent(){
    string str, str1;
    string positionOfCurrency1 = "[87]";
    string positionOfCurrency2 = "[90]";
    size_t positionOfText1, positionOfText2;
    ifstream reading;
    reading.open("file_Currency.txt");
    while (!reading.eof()){ 
        getline (reading, str);

        positionOfText1 = str.find(positionOfCurrency1);
        positionOfText2 = str.find(positionOfCurrency2);
        cout << "positionOfCurrency1 " << positionOfText1 << endl;
        cout << "positionOfCurrency2 " << positionOfText2 << endl;

        //str1= str.substr (positionOfText);
        cout << "String" << str1 << endl;
    }

    reading.close(); 

通貨ファイルの更新:

[79]続きを読む»ブレントはユーロ圏経済への懸念で102ドルに下落

市場データ

 * Currencies

キャプション: 通貨

      Name      Price    Change % Chg
   [80]USD/SGD
              1.2606     -0.00  -0.13%

                                       USD/SGD [81]USDSGD=X
   [82]EUR/SGD
              1.5242     0.00   +0.11%

                                       EUR/SGD [83]EURSGD=X
4

3 に答える 3

2

それは、「データの抽出が何を意味するか」に大きく依存します。単純なケースでは、ファイルを文字列に読み込んでから、文字メンバー関数 (特にfindおよび) を使用substrして、関心のあるセグメントを抽出できます。行ごとのデータに関心がある場合は、 getlineが行抽出の方法です。find前と同じように適用しsubstrて、セグメントを取得します。

単純な方法findではうまくいかない場合があり、興味のある部分に簡単にアクセスするには正規表現が必要になります。

多くの場合、単純なパーサーは進化し、すぐにregular expressions. これは、多くの場合、 Boost.Spiritを解析する C++ の非常に大きなハンマーの時間を知らせます。

于 2012-07-25T00:00:53.063 に答える
1

Boost.Tokenizerは文字列を解析するのに役立ちますが、これらの区切り文字が角かっこで囲まれた数字である必要がある場合は、少し複雑になります。説明されている区切り文字を使用すると、おそらく正規表現で十分です。

于 2012-07-25T00:06:13.577 に答える
0

行うことは、reading の出力と文字列 "[1]" および "[2]" を連結することだけです。このコードは、scanf. scanf(C の残りの部分と同様に) C++ でも機能するので、それが機能する場合はそれを使用します。

とはいえ、これを実行できる洗練度にはさまざまなレベルがあります。正規表現の使用は、最も強力で柔軟な方法の 1 つですが、やり過ぎかもしれません。私の意見では、最も簡単な方法は次のようなことです。

  • 部分文字列 "[1]" のインデックスを検索し、i1
  • 部分文字列 "[2]" のインデックスを検索し、i2
  • i1+3との間の部分文字列を取得しi2ます。

std::string lineコードでは、次のテキストがあると仮定します。

size_t i1 = line.find("[1]");
size_t i2 = line.find("[2]");
std::string out(line.substr(i1+3, i2));

警告: エラー チェックはありません。

于 2012-07-25T00:01:34.943 に答える