2017-04-13 14 views
0

.datファイルを読み込んだ後のコードで、 ';'で区切られた文字列に格納された多数のフレーム名(列)とタイミング(マイクロ秒)(行)で構成される.csv形式ファイルを生成します。 :時間文字列の減算

私は助けを必要と何

MFK3_ECAN 1625069169;1625072194;1625072216;1625072229;1625072241;1625072253;MFK3_VIDEO_FrameID 1625334304;1625612508;1625890712;1626168916;1626447120;1626725324;
が、これらは上記の二つの「固有の名前」の文字列を言及したことにより、溶液は、各時間フレームのために引くことができる見つけることです(秒すなわちmicsec/10^7に変換)と3秒以上の時間差がある場合、 ".datファイルが破損している"と記録する必要があるという制約があります。

.datファイルの読み取りコードの一部:

std::string file_name = m_Filename.toStdString(); 
    size_t found = file_name.find (".dat"); 
    file_name.erase (found, 4); 
    file_name.insert (found, "_Timestamp_Log"); 
    file_name += ".csv"; 
    m_log.open (file_name.c_str(), std::ofstream::out); 
    QList<tTimeStamp> tmp_lst; 
    for (int col = 0; col < m_nStreamCnt; col++) 
    { 
     tmp_lst = m_TimestampMap.value(col+1); 

     m_log << m_StreamIDMap.value(col+1).toStdString() << ";"; //writing Column names 

     for(int row = 0; row < tmp_lst.size(); row++) 
     { 
      m_log << QString::number(tmp_lst.at(row)).toStdString() << ";"; //writing Row values 
     } 

     m_log << endl; 
    } 

    m_log.close(); 
+0

私はあなたのアルゴリズムの問​​題を理解しません。あなたは、壊れた有効なファイルの例を、重要な部分に減らしてください。 あなたのコードリストも役に立たない。いくつかのコメント、あなたがやっていること、働いている/働いていないことを追加してください。 – OutOfBound

+0

確かに、私はそれをよりよく説明しようとすることができます。 – Alto

答えて

1

最後に、私は解決策を試しました。今のところ明らかなように、私は完全な情報を求めていませんでした。しかし、それでも解決策がそのような問題に遭遇する可能性のある他の人たちを助けることができれば幸いです。
問題1:特定のストリーム名を検索し、後で減算するためにtoFloat()を使用して格納する必要がありました。注意:toInt()またはtoStdString()は不正な値を返します。

問題2:QStringの::数([0] tmp_lst)減算のいずれかの差が3秒未満でチェックする文字列から最初の数を与えます。

for (int col = 0; col < m_nStreamCnt; col++) //m_nStreamCnt contains function names 
    { 
     tmp_lst = m_TimestampMap.value(col+1); 

     m_log << m_StreamIDMap.value(col+1).toStdString() << ";"; //Column names 

     if (m_StreamIDMap.value(col+1) == "MFK3_VIDEO_FrameID") 
     { 

        m_log << QString::number(tmp_lst[0]).toStdString() << ";"; //Row values 
        m_current = QString::number(tmp_lst[0]).toFloat(); 
      m_current = m_current/10000000; 
     } 

     else if (m_StreamIDMap.value(col+1) == "MFK3_ECAN") 
     { 
      m_future = QString::number(tmp_lst[0]).toFloat(); // 
      m_future = m_future/10000000; 
        m_log << QString::number(tmp_lst[0]).toStdString() << ";"; //Row values 
     } 
m_diff = std::abs(m_current - m_future); // 

    if (m_diff <= 3) 
    { //details etc} 
+0

あなたが解決策を見つけるのを見てうれしい。 –

0

を私はあなたの説明から欲しいものを言うことができません。たぶん些細なコードの後に​​役立ちますか?

long pre = -1; 
for(int row = 0; row < tmp_lst.size(); row++) 
{ 
    //writing Row values 
    if (pre == -1 || ((long)tmp_lst.at(row) - pre) < 3000000) { 
     m_log << QString::number(tmp_lst.at(row)).toStdString() << ";"; 
    } else { 
     m_log << ".dat file is corrup"; 
    } 
    pre = tmp_lst.at(row); 
}