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
相关产品推荐
相关产品推荐

