0

大きなテキスト ファイルからデータを抽出して分析したいと考えています。データには、浮動小数点数、整数、および単語が含まれます。

私がこれを行うと考えた方法は、std::getline() を使用して完全な行 (改行まで) を抽出することです。次に、前に抽出された行から個々のデータを抽出します (空白まで抽出してから繰り返します)。

これまでのところ、私はこれを持っています:

int main( )
{
    std::ifstream myfile;
    myfile.open( "example.txt", std::ios::in );

    if( !(myfile.is_open()) )
    {   std::cout << "Error Opening File";
        std::exit(0);   }

    std::string firstline;


    while( myfile.good() )
    {
        std::getline( myfile, firstline);
        std::cout<< "\n" << firstline <<"\n";
    }

    myfile.close();
    return 0;
}

いくつかの問題があります。

1) 空白まで抽出するにはどうすればよいですか?

2) データを保存する最良の方法は何ですか? 約 7 ~ 9 種類のデータ型があり、データ ファイルは大きくなります。

編集: ファイルの例は次のようになります。

結果 時間 現在のパス要件
合格 04:31:05 14.3 Super_Duper_capacitor_413 -39.23 不合格
04:31:45 13.2 Super_Duper_capacitor_413 -45.23
...

最終的にはデータを分析したいと考えていますが、これまでのところ、適切な入力/読み取りに関心があります。

4

2 に答える 2

2

を使用std::stringstreamしてデータを解析し、空白のスキップについて心配させることができます。入力行の各要素には追加の処理が必要なように見えるため、それらをローカル変数に解析し、すべての後処理が完了したら、最終結果をデータ構造に格納します。

#include <sstream>
#include <iomanip>


std::stringstream templine(firstline);

std::string passfail;
float floatvalue1;
std::string timestr;
std::string namestr;
float floatvalue2;

//  split to two lines for readability
templine >> std::skipws; // no need to worry about whitespaces
templine >> passfail >> timestr >> floatvalue1 >> namestr >> floatvalue2;

データが正しい形式であることを検証する必要がない、または検証したくない場合は、行を直接データ構造に解析できます。

struct LineData
{
    std::string passfail;
    float floatvalue1;
    int hour;
    int minute;
    int seconds;
    std::string namestr;
    float floatvalue2;
};

LineData a;
char sep;

// parse the pass/fail
templine >> a.passfail;
// parse time value
templine >> a.hour >> sep >> a.minute >> sep >> a.seconds;
// parse the rest of the data
templine >> a.timestr >> a.floatvalue1 >> a.namestr >> a.floatvalue2;
于 2013-06-03T13:40:26.910 に答える