0

私のシナリオでは、CSV を使用してパラメーター ファイルを作成する必要があります。すべての行は構成データを意味し、行の最初のフィールドはヘッダーとして扱われ、識別子として使用されます。以下のような CSV の形式は、解析が簡単です。

1,field1,field2,field3,field4 // 1 indicated the TARGET that the other fields will be writted to.
1,field1,field2,field3,field4
2,field1,field2,field3,field4
2,field1,field2,field3,field4........

しかし、それはユーザーにとってフレンドリーではありません。そのため、以下のように csv ファイルを定義します。

HeaderLine_Begin,1
field1,field2,field3,field4
field1,field2,field3,field4
HeaderLine_Begin,2
field1,field2,field3,field4
field1,field2,field3,field4

つまり、すべての行はデータが HeaderLine_Begin によってターゲットに書き込まれることを意味します。実際のデータから ID を分離するだけです。次に、次のような構造体を作成します。

    enum myenum
    {
      ON,OFF,NOCHANGE
    };

    struct Setting
    {
      int TargetID;

      string field1;
      string field2;
      myenum field3;
      myenum field4;    
    };

以下のようにcsvを1行ずつ読み取るためのコードを書く方法を知っていました

filename +=".csv";

std::ifstream file(filename.c_str());
std::string line;

while ( file.good() )
{       
    getline ( file, line, '\n' ); // read a line until last 
    if(line.compare(0,1,"#") == 0) // ignore the comment line
        continue;

    ParseLine();// DONE.Parse the line if it's header row OR data row           
}

file.close(); // close file

私がやりたいのは、データを保持するためのvetor設定のようなリストを作成することです.フローは、最初のheaderID1を見つけて、次の行を見つける必要があります.次の行がデータラインの場合、データラインが属するものとして扱いますheaderID1.次の行が別の headerID の場合、再度ループします。

問題は、headerRow を見つけた後に行をフェッチするための std::getnextline(int lineIndex) がないことです。

4

2 に答える 2

1

入力ループは次のようになります。

int id = -1;
while (getline(file, line))
{
     if (line.empty() || line[0] == '#')
         continue;
     if (starts_with_and_remove(line, "HeaderLine_Begin,"))
         id = boost::lexical_cast<int>(line); // or id = atoi(line.c_str())
     else
     {
         assert(id != -1);
         ...parse CSV, knowing "id" is in effect...
     }
}

と:

bool stats_with_and_remove(std::string& lhs, const std::string& rhs)
{
    if (lhs.compare(0, rhs.size(), lhs) == 0)  // rhs.size() > lhs.size() IS safe
    {
        lhs.erase(0, rhs.size());
        return true;
    }
    return false;
}
于 2013-07-12T07:40:41.133 に答える