如何按非精确列名(Value+日期)遍历DataTable并获取单元格值
解决方法
首先得说明下:DataRow的索引器并不支持直接用通配符(比如Value%)来取值,所以我们得先从Test_DT的列集合里筛选出符合前缀规则的列,之后再遍历每行获取对应单元格的值。
步骤1:定位目标列
我们可以通过列名的前缀匹配(比如以Value @开头)来找到目标列。这里用LINQ会比较简洁,也可以用循环遍历列集合:
// 筛选出列名以"Value @"开头的列(如果只需要第一个匹配的列,用FirstOrDefault;要所有匹配的就用Where) var targetColumn = Test_DT.Columns.Cast<DataColumn>() .FirstOrDefault(col => col.ColumnName.StartsWith("Value @")); if (targetColumn == null) { // 没找到符合条件的列,这里可以加异常处理或者提示逻辑 Console.WriteLine("未找到以'Value @'开头的目标列"); return; }
步骤2:遍历每行取值
找到目标列后,就可以逐行获取对应单元格的值了:
foreach (DataRow row in Test_DT.Rows) { // 直接用找到的列对象取值,避免列名拼写出错的问题 var cellValue = row[targetColumn]; // 这里可以根据需求对cellValue做后续处理,比如转换类型、打印输出等 Console.WriteLine($"当前行的目标单元格值:{cellValue}"); }
处理多匹配列的情况
如果你的Test_DT里可能存在多个以Value @开头的列(比如不同日期的同类型列),可以遍历所有符合条件的列再逐行取值:
var targetColumns = Test_DT.Columns.Cast<DataColumn>() .Where(col => col.ColumnName.StartsWith("Value @")) .ToList(); foreach (var col in targetColumns) { Console.WriteLine($"正在处理列:{col.ColumnName}"); foreach (DataRow row in Test_DT.Rows) { var cellValue = row[col]; Console.WriteLine($"第{row.Table.Rows.IndexOf(row)+1}行的值:{cellValue}"); } }
关于正则匹配的问题
如果之前尝试正则没成功,大概率是表达式写得不够精准。比如要严格匹配Value @MM/DD/YYYY格式的列名,可以用下面的正则来筛选:
using System.Text.RegularExpressions; // 匹配"Value @"开头,后面跟MM/DD/YYYY格式日期的列名 var columnRegex = new Regex(@"^Value @\d{2}/\d{2}/\d{4}$"); var targetColumn = Test_DT.Columns.Cast<DataColumn>() .FirstOrDefault(col => columnRegex.IsMatch(col.ColumnName));
这样就能精准定位到符合格式的列了。
内容的提问来源于stack exchange,提问作者Shantanu Khaladkar
相关产品推荐
相关产品推荐

