2017-04-13 83 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 :: number(tmp_lst [0])會給字符串的第一個數字進行相減,並檢查差值是否小於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); 
}