如何在C#中按字符拆分DataTable列并处理分隔符前后空格?
问题:拆分DataTable的Message列为PRNumber和Message列
需求:将DataTable的Message列按分隔符(:或-,前后可能存在空格)拆分为PRNumber和Message两列,输入输出示例如下:
输入DataTable
Message -------- PR-111: test message PR-112 - test message new PR-113 : test message new2
期望输出DataTable
PRNumber Message ------ ----------- PR-111 test message PR-112 test message new PR-113 test message new2
我尝试了以下代码但未得到正确结果:
var r = dt1.AsEnumerable().Select(g => new { PRNumber = g["Message"].ToString().Contains(":") == true ? g["Message"].ToString().Split(':')[0] : g["Message"].ToString().Split('-')[0], Message = g["Message"].ToString().Contains(":") == true ? g["Message"].ToString().Split(':')[0] : g["Message"].ToString().Split('-')[1] }).ToList();
问题分析
你的代码存在几个关键问题:
- 拆分逻辑错误:只通过是否包含
:来选择拆分符,但PR编号本身就带有-(比如PR-111),用-拆分时会把PR单独切出来,导致PRNumber取值错误。 - Message列取值错误:当内容含
:时,你错误取了Split(':')[0](这是PRNumber的内容),应该取拆分后的第二部分。 - 未处理空格:分隔符前后的空格没有被去除,会导致提取的内容带多余空格。
解决方案:使用正则表达式精准匹配
推荐用正则表达式处理这种多分隔符+空格的场景,能精准提取PR编号和消息内容。
代码示例
using System.Text.RegularExpressions; // 预编译正则表达式,提升重复匹配性能 var prRegex = new Regex(@"^(PR-\d+)\s*[:-]\s*(.*)$", RegexOptions.Compiled); var result = dt1.AsEnumerable() .Select(row => { var msgContent = row["Message"].ToString(); var matchResult = prRegex.Match(msgContent); if (matchResult.Success) { return new { PRNumber = matchResult.Groups[1].Value.Trim(), Message = matchResult.Groups[2].Value.Trim() }; } // 处理格式不符合的行,可根据需求调整默认值 return new { PRNumber = string.Empty, Message = msgContent }; }) .ToList();
正则表达式说明
^(PR-\d+)\s*[:-]\s*(.*)$
^:匹配字符串开头(PR-\d+):捕获PR编号(比如PR-111),作为PRNumber\s*[:-]\s*:匹配分隔符(:或-),同时忽略分隔符前后的任意空格(.*)$:捕获分隔符后的所有内容,作为Message
这样处理后,不管分隔符是:还是-,前后有没有空格,都能准确拆分出需要的两列。
内容的提问来源于stack exchange,提问作者sandeep.mishra
相关产品推荐
相关产品推荐

