【问题标题】:Time strings subtraction时间字符串减法
【发布时间】:2017-04-13 07:01:57
【问题描述】:

读取 .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();  

【问题讨论】:

  • 我不明白你的算法问题。您能否添加一个损坏且有效文件的示例,简化为基本部分?您的代码清单也无济于事。请添加一些 cmets,你在做什么,什么工作/不工作。
  • 当然,我可以试着解释得更好。

标签: c++ adtf


【解决方案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}

【讨论】:

  • 很高兴看到您找到解决方案。
【解决方案2】:

我无法从您的描述中看出您想要什么。也许遵循琐碎的代码会有所帮助?

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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 2010-09-12
    相关资源
    最近更新 更多