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

.NET中按逗号拆分DataTable行生成多行的正确实现方案求助

解决DataTable中Drug字段按逗号拆分并生成多行的问题

问题分析

你当前的代码存在两个核心问题:

  • 只提取了Drug字段拆分后的字符串数组,完全丢失了Dosage和Patient这两个关键字段
  • 你的ToDataTable扩展方法是为带有属性的实体类设计的,直接传入string[]会导致反射出的只有Length属性,生成的DataTable结构完全不符合需求

正确实现方案

我们需要遍历原DataTable的每一行,对Drug字段进行拆分,然后为每个拆分后的Drug值创建新行,同时保留原行的Dosage和Patient值。具体步骤如下:

  1. 复制原DataTable的结构到新表
  2. 遍历原表的每一行数据
  3. 拆分当前行的Drug字段
  4. 为每个拆分后的Drug值创建新行,复制原行的Dosage和Patient,并设置对应的Drug值
  5. 将新行添加到新表中

完整代码实现

private static DataTable ProcessDatatable(DataTable dt)
{
    // 复制原表的结构到新表
    DataTable dtnew = dt.Clone();

    foreach (DataRow row in dt.Rows)
    {
        // 获取当前行的Drug字段值,处理空值情况
        string drugs = row.Field<string>("Drug") ?? string.Empty;
        // 按逗号拆分Drug字段,剔除空条目
        string[] drugList = drugs.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

        foreach (string drug in drugList)
        {
            // 创建新行
            DataRow newRow = dtnew.NewRow();
            // 复制原行的Dosage和Patient值
            newRow["Dosage"] = row["Dosage"];
            newRow["Patient"] = row["Patient"];
            // 设置拆分后的Drug值(去除可能的空格)
            newRow["Drug"] = drug.Trim();
            // 添加到新表
            dtnew.Rows.Add(newRow);
        }
    }

    return dtnew;
}

代码说明

  • 使用dt.Clone()快速复制原表的结构,避免手动创建列的麻烦
  • 用StringSplitOptions.RemoveEmptyEntries处理Drug字段为空或者有多余逗号的异常情况
  • 用drug.Trim()去除拆分后Drug值可能带的空格(适配实际场景中可能存在的格式问题)
  • 遍历过程中完整保留原行的Dosage和Patient值,确保每一行数据的完整性

测试验证

用你提供的示例DataTable运行这段代码后,会得到你预期的结果:

Dosage Drug Patient

25 Indocin David
50 Enebrel Sam
50 Crozine Sam
10 Hydralazine Christoff
21 Combivent Janet
100 Dilantin Melanie

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:16:34