#include <iostream> // 包含C++标准输入输出库
#include <fstream> // 包含C++文件输入输出流库
#include <sstream> // 包含C++字符串流库
#include <string> // 包含C++字符串库
#include <vector> // 包含C++动态数组库
#include <filesystem> // 包含C++17中的文件系统库
#include <chrono> // 包含C++时间库
#include <cmath> // 包含C++数学函数库
namespace fs = std::filesystem; // 为std::filesystem命名空间创建一个别名fs
// 定义一个函数,用于将日期时间字符串转换为毫秒时间戳
unsigned long long ConvertToTimeStamp(const std::string& datetime) {
// ...(省略了函数体,后面会解释)
}
// 定义一个函数,用于将时间戳四舍五入到最近的500毫秒
unsigned long long RoundToNearest500(unsigned long long timeStamp) {
// ...(省略了函数体,后面会解释)
}
int main() { // 主函数开始
fs::path sourceDir = "D:/00ceshi_data"; // 定义源文件夹路径
fs::path destDir = "D:/00ceshi_data_chuLi"; // 定义目标文件夹路径
fs::create_directories(destDir); // 确保目标文件夹存在,如果不存在则创建
// 遍历源文件夹中的每个子文件夹
for (const auto& subdirEntry : fs::directory_iterator(sourceDir)) {
if (fs::is_directory(subdirEntry.status())) { // 如果当前项是文件夹
fs::path subdir = subdirEntry.path(); // 获取子文件夹的路径
fs::path subdirName = subdir.filename(); // 获取子文件夹的名称
fs::path destSubdir = destDir / subdirName; // 构建目标子文件夹的路径
fs::create_directories(destSubdir); // 确保目标子文件夹存在,如果不存在则创建
// 遍历子文件夹中的每个文件
for (const auto& fileEntry : fs::directory_iterator(subdir)) {
if (fs::is_regular_file(fileEntry.status()) && fileEntry.path().extension() == ".csv") {
// 如果当前项是常规文件且文件扩展名为.csv
fs::path filePath = fileEntry.path(); // 获取csv文件的路径
fs::path destFilePath = destSubdir / filePath.filename(); // 构建目标csv文件的路径
std::ifstream infile(filePath); // 打开源文件进行读取
std::ofstream outfile(destFilePath, std::ofstream::out); // 打开目标文件进行写入
std::string line; // 用于存储从源文件中读取的每一行
unsigned long long prevTimeStamp = 0; // 用于存储上一个时间戳,初始化为0
// 逐行读取源文件
while (std::getline(infile, line)) {
std::istringstream iss(line); // 使用字符串流来处理每一行
std::string token; // 用于存储从字符串流中读取的每个令牌(由逗号分隔)
std::vector<std::string> tokens; // 存储所有令牌的动态数组
// 从字符串流中读取令牌并存储到tokens数组中
while (std::getline(iss, token, ',')) {
tokens.push_back(token);
}
if (tokens.size() >= 8) { // 确保令牌数量足够
unsigned long long timeStamp = ConvertToTimeStamp(tokens[1]); // 将第二个令牌(索引为1)转换为时间戳
timeStamp = RoundToNearest500(timeStamp); // 将时间戳四舍五入到最近的500毫秒
// 如果需要,插入额外的行
while (prevTimeStamp && prevTimeStamp + 500 < timeStamp) {
prevTimeStamp += 500;
// 将新的时间戳和其他令牌写入目标文件,同时跳过原始的时间戳令牌并计算新值
// ...(省略了具体的写入操作)
}
// 将当前行的时间戳和其他令牌写入目标文件,同时跳过原始的时间戳令牌并计算新值
// ...(省略了具体的写入操作)
prevTimeStamp = timeStamp; // 更新上一个时间戳
}
}
infile.close(); // 关闭源文件
outfile.close(); // 关闭目标文件
}
}
}
}
return 0; // 主函数返回0,表示程序正常结束
}
// ConvertToTimeStamp和RoundToNearest500函数的具体实现在此省略,因为它们的功能已在注释中描述