时间字符串减法
Time strings subtraction
读取.dat文件并生成.csv格式文件后的代码,该文件由许多帧名称(列)和各自的时序(微秒)(行)组成,存储在以';'分隔的字符串中:
MFK3_ECAN 1625069169;1625072194;1625072216;1625072229;1625072241;1625072253;
MFK3_VIDEO_FrameID 1625334304;1625612508;1625890712;1626168916;1626447120;1626725324;
我需要帮助的是找到一个解决方案,通过该解决方案可以在每个时间范围内减去上面提到的两个 "specific name" 字符串(转换为秒,即 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();
从你的描述看不出你想要什么。也许遵循简单的代码有帮助?
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);
}
所以,我终于找到了解决方案。到目前为止,很明显我没有询问完整的信息。但尽管如此,希望该解决方案能帮助其他可能遇到此类问题的人。
问题 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}
读取.dat文件并生成.csv格式文件后的代码,该文件由许多帧名称(列)和各自的时序(微秒)(行)组成,存储在以';'分隔的字符串中:
MFK3_ECAN 1625069169;1625072194;1625072216;1625072229;1625072241;1625072253;
MFK3_VIDEO_FrameID 1625334304;1625612508;1625890712;1626168916;1626447120;1626725324;
我需要帮助的是找到一个解决方案,通过该解决方案可以在每个时间范围内减去上面提到的两个 "specific name" 字符串(转换为秒,即 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();
从你的描述看不出你想要什么。也许遵循简单的代码有帮助?
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);
}
所以,我终于找到了解决方案。到目前为止,很明显我没有询问完整的信息。但尽管如此,希望该解决方案能帮助其他可能遇到此类问题的人。
问题 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}