You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于时间戳条件提取数据的C#应用开发技术咨询

C#按时间戳提取结构化数据的实现方案

嘿,这个需求我之前做物联网数据解析的时候碰到过类似场景,给你整理几个实用的实现思路和代码示例:

1. 先定义对应的数据模型

首先我们需要一个类来映射每一行数据,方便后续的处理和过滤:

using System;
using System.Globalization;

public class DataRecord
{
    public int Column1 { get; set; }
    public int Column2 { get; set; }
    public int Column3 { get; set; }
    public DateTime TimeStamp { get; set; }
}

2. 实现数据行的解析逻辑

因为你的时间戳字段包含空格,不能直接按空格拆分所有元素,所以要单独处理时间部分:

public static DataRecord TryParseLine(string line)
{
    // 跳过表头行
    if (line.TrimStart().StartsWith("Column1"))
        return null;

    var parts = line.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries);
    // 校验数据格式是否合法
    if (parts.Length < 4)
        return null;

    // 解析前三个数值列
    if (!int.TryParse(parts[0], out int col1) ||
        !int.TryParse(parts[1], out int col2) ||
        !int.TryParse(parts[2], out int col3))
    {
        return null;
    }

    // 拼接时间戳字符串(跳过前三个元素,剩下的部分拼接)
    var timeStr = string.Join(" ", parts.Skip(3));
    // 按指定格式解析时间,注意要包含毫秒部分
    if (!DateTime.TryParseExact(
        timeStr, 
        "yyyy-MM-dd HH:mm:ss.fff", 
        CultureInfo.InvariantCulture, 
        DateTimeStyles.None, 
        out DateTime timeStamp))
    {
        return null;
    }

    return new DataRecord
    {
        Column1 = col1,
        Column2 = col2,
        Column3 = col3,
        TimeStamp = timeStamp
    };
}

3. 按时间戳条件提取数据

根据你的需求,这里提供几种常见的过滤场景:

场景1:提取指定时间范围内的数据

using System.Collections.Generic;
using System.IO;
using System.Linq;

var startTime = new DateTime(2017, 4, 25, 14, 15, 15);
var endTime = new DateTime(2017, 4, 25, 14, 16, 0);
var filteredRecords = new List<DataRecord>();

// 流式读取文件,避免大文件占用过多内存
foreach (var line in File.ReadLines("your-data-file.txt"))
{
    var record = TryParseLine(line);
    if (record != null && record.TimeStamp >= startTime && record.TimeStamp <= endTime)
    {
        filteredRecords.Add(record);
    }
}

场景2:提取某个精确时间点的记录

var targetTime = new DateTime(2017, 4, 25, 14, 15, 30);
var targetRecord = filteredRecords.FirstOrDefault(r => r.TimeStamp == targetTime);

场景3:按固定间隔提取(比如每30秒取一条)

因为你的数据是每15秒一条,所以间隔提取可以直接按索引过滤:

// 每隔1条取1条(即每30秒一条)
var intervalRecords = filteredRecords.Where((record, index) => index % 2 == 0).ToList();

// 或者提取从某个时间点之后的所有记录
var afterTime = new DateTime(2017, 4, 25, 14, 15, 45);
var afterRecords = filteredRecords.Where(r => r.TimeStamp > afterTime).ToList();

额外优化建议

  • 如果数据量极大,建议使用LINQ to Objects的延迟查询,避免一次性加载所有数据到内存;
  • 可以将解析逻辑封装成一个扩展方法,提高代码复用性;
  • 对于频繁的时间查询,可以将解析后的记录按时间戳排序后,使用二分查找来提高查询效率。

内容的提问来源于stack exchange,提问作者Agni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:42:47