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

C#从文本文件生成CSV:提取指定列(日期等)遇解析问题求助

问题描述

需要从文本文件生成CSV文件,文本数据示例如下:

{Sll} 2022 Oct 04 14:55:06.838 [i] [Column 2][column 3] Loading text...
{Sll} 2022 Oct 04 14:55:06.838 [i] [Column 2][column 3 ] Loading text....
{Sll} 2022 Oct 04 14:55:06.839 [i] [Column 2][column 3 ] Loading text....

需提取三列数据:

  • 第一列:完整日期时间(如2022 Oct 04 14:55:06.838)
  • 第二列:Column 2类文本
  • 第三列:column 3类文本

尝试了多种C#代码提取日期时间但未成功,代码如下:

Match match = Regex.Match(TextContents.GetLineText(i), @"\d{4}\/\d{3}\/\d{2}");

string date = match.Value;
if (!string.IsNullOrEmpty(date))
{
    var dateTime = DateTime.ParseExact(date, "yyyy MMM d H:m:s.fff",  CultureInfo.CurrentCulture);
    Console.WriteLine(dateTime.ToString());
}

writer.WriteLine(date);
newfile.Select(line => DateTime.ParseExact(line.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries)[2], "yyyy MMM d H:m:s.fff", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal));
DateTime time = DateTime.ParseExact(TextContents.GetLineText(i).Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)[2], "yyyy MMM d H:m:s.fff", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal);
解决方案

1. 日期时间提取问题分析

  • 正则表达式@"\d{4}\/\d{3}\/\d{2}"使用斜杠分隔符,但实际数据是空格分隔,完全匹配不到日期部分。
  • 通过Split取索引2的方式仅获取到年份2022,但完整日期时间包含年份、月份、日期、时间四个连续部分,单独取索引2无法得到完整值。

2. 正确提取方案(正则匹配整行)

使用完整正则表达式匹配整行,一次性提取所有需要的字段,兼容不同空格数量和字段格式:

using System;
using System.Globalization;
using System.IO;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        string inputPath = "输入文件路径.txt";
        string outputPath = "输出文件.csv";

        // 正则规则:匹配整行并分组提取目标字段
        Regex regex = new Regex(@"^\{Sll\}\s+(\d{4}\s+\w{3}\s+\d{2}\s+\d{2}:\d{2}:\d{2}\.\d{3})\s+\[i\]\s+\[([^\]]+)\]\[([^\]]+)\]");

        using (StreamReader reader = new StreamReader(inputPath))
        using (StreamWriter writer = new StreamWriter(outputPath))
        {
            // 写入CSV表头
            writer.WriteLine("日期时间,第二列,第三列");

            string line;
            while ((line = reader.ReadLine()) != null)
            {
                Match match = regex.Match(line);
                if (match.Success)
                {
                    // 提取各组数据并去除前后空格
                    string dateTimeStr = match.Groups[1].Value;
                    string column2 = match.Groups[2].Value.Trim();
                    string column3 = match.Groups[3].Value.Trim();

                    // 安全解析日期时间,避免异常
                    if (DateTime.TryParseExact(dateTimeStr, "yyyy MMM dd HH:mm:ss.fff", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime dateTime))
                    {
                        // 格式化CSV行(若字段含逗号,需添加双引号包裹)
                        writer.WriteLine($"{dateTime:yyyy-MM-dd HH:mm:ss.fff},{column2},{column3}");
                    }
                    else
                    {
                        // 解析失败时保留原日期字符串
                        writer.WriteLine($"{dateTimeStr},{column2},{column3}");
                    }
                }
            }
        }
    }
}

3. 关键说明

  • 正则表达式各部分作用:
    • ^\{Sll\}\s+:匹配开头的{Sll}及后续任意空格
    • (\d{4}\s+\w{3}\s+\d{2}\s+\d{2}:\d{2}:\d{2}\.\d{3}):分组提取完整日期时间
    • \s+\[i\]\s+:匹配[i]前后的任意空格
    • \[([^\]]+)\]\[([^\]]+)\]:分别提取[ ]包裹的第二、三列内容
  • 使用Trim()处理第二、三列的前后空格,解决示例中column 3末尾带空格的问题
  • 用DateTime.TryParseExact替代ParseExact,避免解析失败时抛出异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 11:28:28