将DataTable值(逗号分隔值)拆分为多行

时间:2017-05-09 20:59:27

标签: c# linq validation datatable

您好!

我的代码存在问题,如下例所示。

我有以下示例数据:

包含2列的DataTable

Fruits         FruitGroup

Banana         FG1,FG2,FG5
Apple            
Melon          FG1,FG6,FG11

我的预期成果必须是这样。

Fruits         FruitGroup

Banana         FG1
Banana         FG2
Banana         FG5
Apple          NA
Apple          NA 
Apple          NA 
Melon          FG1
Melon          FG6
Melon          FG11

这是我最近在StackOverflow中找到的失败尝试。

            var tblfruitflat = fruitTable.Clone();
            foreach (DataRow row in fruitTable.Rows)
            {
                string frutas = row.Field<string>("Fruit");
                string frutasGroup = row.Field<string("FruitGroup").Split(',');
                for (int ir = 0; ir < frutasGroup.Length; ir++)
                {
                    var newRow = tblfruitflat.Rows.Add();
                    newRow.SetField("Fruits", frutas[ir]);
                    newRow.SetField("FruitGroup", fruitGroup.ElementAtOrDefault(ir));

                }
            }

不得不提的是,我的FruitGroup列中的空字符串必须为“NA”。 我迷失了如何处理这个问题。

谢谢! 代码片段感谢@Tim Schmelter

2 个答案:

答案 0 :(得分:1)

希望这会让你的头脑在正确的空间。我没有将这些名称与您的实现完全匹配,但逻辑仍然适用。

//Work inside a for loop so you can manipulate the rows collection.
        for (int i = 0; i < previousLength; i++)
        {
            //First, get your split values.
            string[] vals = namesTable.Rows[i][0].ToString().Split(',');

            //only operate on rows that were split into multiples.
            if (vals.Length > 1)
            {
                //Add a  new row for each item parsed from value string
                foreach (string s in vals)
                {
                    DataRow newRow = namesTable.NewRow();
                    newRow[0] = namesTable.Rows[i].ToString();
                    newRow[1] = s;
                    namesTable.Rows.Add(newRow);
                }
            }
        }

        //Remove old rows
        for (int i = 0; i < previousLength; i++)
        {
            namesTable.Rows.RemoveAt(i);
        }

答案 1 :(得分:1)

我不确定你的答案如何从一个输入行获得3行Apple,NA,但如果一行Apple行没问题,请执行以下操作:

var ans = from r in d1 from fg in r.FruitGroup.Split(',') select new { r.Fruit, FruitGroup = (fg == String.Empty) ? "NA" : fg };

如果您希望FruitGroup始终是三个项目并且需要三个Apple行,请执行以下操作:

var ans2 = from r in d1 from fg in ((r.FruitGroup == String.Empty) ? new String[3] : r.FruitGroup.Split(',')) select new { r.Fruit, FruitGroup = (String.IsNullOrEmpty(fg)) ? "NA" : fg };