如何在C ++中有效地分组成千上万的数据输入?

问题描述 投票:0回答:1

假设我有多个csv文件,每个文件包含近10000多行数据。但是我只需要在每一行中将一个特定的单元格(F列中的纪元时间戳)输入到程序中并进行分组即可。

enter image description here

在程序中,我必须将此时间数据分组为上午8点到下午5点之间的16天,间隔为10、120和300秒。

x时期时间戳将在8:00:00到8:00:09间隔之间进行分组,y单元格将在8:00:10到8:00:19之间进行分组,依此类推。

是否有一种有效的方法可以在C ++中执行此操作,而无需手动定义数千个数组?我知道这样的应用程序可能更适合Matlab或R之类的数据处理语言,但是我想看到一些不同的解决方案。

c++ data-processing
1个回答
0
投票

如果我正确理解了这个问题,则可以使用单个std::vector进行处理,并在读取时间戳后对其进行排序。排序后,您可以遍历向量一次(嗯,对于您要定义的每个组大小,一次)以确定向量在向量中的何处开始:

#include <stdio.h>
#include <vector>

unsigned int CalculateSecondsSinceMidnightOnFirstDay(int whichDay, int hours, int minutes, int seconds)
{
   unsigned int ret = seconds;
   ret += (minutes*60);
   ret += (hours*60*60);
   ret += (whichDay*24*60*60);
   return ret;
}

unsigned int CalculateGroupIDFromSeconds(unsigned int secondsSinceMidnightOnFirstDay, unsigned int secondsPerGroup)
{
   return (secondsSinceMidnightOnFirstDay/secondsPerGroup);
}

int main(int, char **)
{
   std::vector<unsigned int> rows;

   // parse out the .csv files and add the timestamps
   // into (rows) here; for this example, I'll just fake it
   rows.push_back(CalculateSecondsSinceMidnightOnFirstDay(3,  6,  2, 15));
   rows.push_back(CalculateSecondsSinceMidnightOnFirstDay(0, 18, 35, 59));
   rows.push_back(CalculateSecondsSinceMidnightOnFirstDay(2,  8, 12, 17));
   rows.push_back(CalculateSecondsSinceMidnightOnFirstDay(2,  8, 12, 18));
   rows.push_back(CalculateSecondsSinceMidnightOnFirstDay(2,  8, 12, 19));
   // ... and so on

   // Now sort the data so that all timestamps are listed in increasing order
   std::sort(rows.begin(), rows.end());

   // Now that the vector is sorted, we can calculate the offset of each group within it
   const unsigned int groupSizeInSeconds = 10;

   unsigned int prevGroupID = (unsigned int) -1;
   for (size_t i=0; i<rows.size(); i++)
   {
      unsigned int curGroupID = CalculateGroupIDFromSeconds(rows[i], groupSizeInSeconds);
      if (curGroupID != prevGroupID)
      {
         printf("Group #%u starts at index #%lu in the array\n", curGroupID, i);
         prevGroupID = curGroupID;
      }
   }

   return 0;
}

如果发现除了时间戳值,您还需要跟踪每个CSV行中的其他数据,则可以将std::vector<unsigned int>替换为std::vector<MyDataRecordClass>,其中MyDataRecordClass是您要输入的classstruct定义同时包含时间戳值和您需要与该值保持在一起的任何其他信息的成员变量;在这种情况下,您还需要实现operator < (const MyDataRecordClass &> constMyDataRecordClassreturn (this->_secondsSinceMidnightOnFirstDay < rhs._secondsSinceMidnightOnFirstDay);方法,以便std::sort()知道如何正确地将向量按时间戳的升序排序。

© www.soinside.com 2019 - 2024. All rights reserved.