嗯,对某些人来说可能很简单,但到目前为止我无法找到任何强大的逻辑来构建以下数据块。
请参阅以下数据块(即1505字节的完整数据集) 在这里,我需要将这些数据切割成500个字节的块(例如,我将它放入一个向量元素),每个元素文本应该以[SampleSet]开头。所以有可能在一个向量元素中我有两个或更多个SampleSet但在其他向量元素中我只得到一个[SampleSet]。
任何线索我怎么能从这开始?
[SampleSet]
SampleTime=2014-08-13 T12:02:04
Data=Type:DataType|Value:0.11|Alert:false|Lead:II
Data=Type:DataType|Value:65|Alert:false
Data=Type:DataType|Value:95|Alert:false
Data=Type:DataType|Value:97.8|Alert:false|Channel:1
Data=Type:DataType|Value:90|Alert:false
Data=Type:DataType|Value:0.10|Alert:false|Lead:I
Data=Type:DataType|Value:0.20|Alert:true|Lead:II
[SampleSet]
SampleTime=2014-08-13 T12:05:09
Data=Type:DataType|Value:82|Alert:false
Data=Type:DataType|Value:98|Alert:true
Data=Type:DataType|Value:97.8|Alert:false|Channel:1
Data=Type:DataType|Value:97.8|Alert:false|Channel:1
Data=Type:DataType|Value:97.2|Alert:false|Channel:2
Data=Type:DataType|Value:31|Alert:false
Data=Type:DataType|Value:120|Alert:true
Data=Type:DataType|Value:95|Alert:true
Data=Type:DataType|Value:90|Alert:false
Data=Type:DataType|Value:0.10|Alert:false|Lead:I
Data=Type:DataType|Value:0.20|Alert:true|Lead:II
[SampleSet]
SampleTime=2014-08-13 T12:05:20
Data=Type:DataType|Value:82|Alert:false
Data=Type:DataType|Value:98|Alert:true
Data=Type:DataType|Value:31|Alert:false
Data=Type:DataType|Value:120|Alert:true
Data=Type:DataType|Value:95|Alert:true
Data=Type:DataType|Value:90|Alert:false
Data=Type:DataType|Value:0.10|Alert:false|Lead:I
Data=Type:DataType|Value:0.20|Alert:true|Lead:II
[SampleSet]
SampleTime=2014-08-13 T12:15:11
Data=Type:DataType|Value:82|Alert:false
Data=Type:DataType|Value:0.10|Alert:false|Lead:I
Data=Type:DataType|Value:0.20|Alert:true|Lead:II
答案 0 :(得分:2)
最直观的方法可能是使用std::string::find
在输入字符串中查找所有标题(= "[SampleSet]"
)的位置。然后,您可以将此输入字符串剪切为令牌,其中每个令牌只包含一个样本集。然后,您可以使用这些令牌来构建500字节的最大块。但是,如果您的样本集的大小通常比块大小小得多,那么您也经常调用find
。
因此,更好的方法是使用std::string::rfind
开始向后搜索500字节块边界右侧的[SampleSet]
- 标头。即找到第一个块开始向后搜索位置[SampleSet]
的标题500
。你从中获得的位置(例如467
)是第一个块的右边界。要查找下一个块,请开始在467+500
向后搜索,依此类推。我希望这个方法很清楚。这是一个示例实现:
std::string input; // your input data
std::vector<std::string> chunks;
std::string header("[SampleSet]");
std::string::size_type chunksize = 500; // size including header
std::string::size_type posL, posR = 0, posEnd = input.length()+1;
while(posR != posEnd)
{
posL = posR;
if (posEnd-posL <= chunksize)
posR = posEnd;
else
posR = input.rfind(header, posL+chunksize);
if (posR-posL)
chunks.push_back(input.substr(posL, posR-posL));
else
{
std::string toobigsample(input.substr(posL, input.find(header,posL+1)-posL));
std::cerr << "Error: SampleSet to big to store in one chunk ("
<< toobigsample.length() << " bytes):" << std::endl << std::endl
<< toobigsample;
break;
}
}