【问题标题】:Separate multiple field values with a comma in a datatable在数据表中用逗号分隔多个字段值
【发布时间】:2021-11-30 14:10:09
【问题描述】:

在我的应用程序中,我有一个函数可以克隆原始数据表并使用它来创建一个新的数据表,并添加一个新列,如下所示:

    private static DataTable CloneTable(DataTable originalTable, DataTable newTable, DataTable targetTable,
        string addedColumn, string columnToExtract, bool multipleConditions = false, string secondColumnName = null, string secondColumnConditon= null)
    {

        newTable = originalTable.Clone();
        newTable.Columns.Add(addedColumn);

        foreach (DataRow row in originalTable.Rows)
        {

            DataRow[] rowsTarget;

            if (multipleConditions == false)
            {
                rowsTarget = targetTable.Select(string.Format("ItemId='{0}'", Convert.ToString(row["ItemId"])));
            } else
            {
               rowsTarget = targetTable.Select(string.Format("ItemId='{0}' AND {1} ='{2}'", Convert.ToString(row["ItemId"]), secondColumnName, secondColumnConditon));
            }


            if (rowsTarget != null && rowsTarget.Length > 0)
            {
                string data = rowsTarget[0][columnToExtract].ToString();
                var lst = row.ItemArray.ToList();
                lst.Add(data);

                newTable.Rows.Add(lst.ToArray());
            }

            else
            {
                string data = "";
                var lst = row.ItemArray.ToList();
                lst.Add(data);
                newTable.Rows.Add(lst.ToArray());
                ErrorLogging.ErrorList.Add(new ErrorLogging()
                {
                    ErrorType = "Warning",
                    Relation = "Database- to do with column: " + addedColumn ,
                    Message = "Data not found for document with the itemId: " + row["ItemId"]
                });
            }

        }          

        return newTable;

    }

这很好用,但是,用于数据表的数据来自 sql 查询,有时在一行中的一个字段中,一个字段中会有多个值。例如,对于列语言,可能有一个具有以下值的字段:英语法语德语。我想要做的是改变它,以便这些值用逗号分隔,我尝试过的是:

            if (rowsTarget != null && rowsTarget.Length > 0)
            {
                string data = rowsTarget[0][columnToExtract].ToString();
                var lst = row.ItemArray.ToList();
                lst.Add(data);
                string test = string.Join(",", lst);

                foreach (DataColumn column in newTable.Columns)
                {
                    if (column.ColumnName == "Language")
                    {
                        Console.WriteLine("test");
                        
                        newTable.Rows.Add(test.ToArray());
                    } 
                }
                newTable.Rows.Add(lst.ToArray());
            }

但我意识到这不起作用,因为这也会影响所有其他列,所以我想知道如何更改它,以便仅影响指定列的字段,以便多个值用逗号分隔?我是走在正确的轨道上还是走错了路?

编辑 -

所以基本上,在这一切结束时,最终的数据表被导出到一个 csv 文件中,这就是它目前的样子:

这就是我想要的样子:

我不确定这是否容易分辨,但在第一张图片中,您会看到对于列 Language 下的字段,当超过 1 个单词时,它不会用逗号分隔,这就是我希望它可以在第二张图片中看到

第二次编辑:

当我尝试以下操作时:

        foreach (DataRow newRow in itemsTable.Rows)
        {

            object cellData = newRow["Language"];

            string test = string.Join(",", cellData.ToString().ToArray());
            Console.WriteLine(test);


        }

它确实添加了一个逗号,但它是在每个字符之后而不是每个单词之后,所以我觉得我越来越近了,但我仍然缺少一些东西

【问题讨论】:

  • 我没有关注你想要做的事情。你能展示一张桌子的前后照片和你想要做的改变吗?
  • @JohnG 我已经更新以表明我的意思,希望现在我想做的事情更有意义?
  • 对不起,如果我遗漏了什么,但是有什么原因你不简单地遍历现有DataTable 中的所有行并添加逗号而不是“创建”一个新的DataTable ?此外,如果您确实想要创建原始表的Clone,那么简单地“克隆”表然后循环遍历前面描述的行不是更容易。换句话说,“克隆”和添加逗号将是两 (2) 种不同的方法。我觉得我错过了一些东西。
  • DataTable 的克隆是出于另一个原因。发现它有点难以解释,但例如我有 2 个查询,Items 和 lastModifiedDate,它们被制成自己的数据表。它们都有一个 ItemId 列,并且应该有匹配的值,在 lastModfiedDate 表中也将有一个同名的列。所以克隆是然后创建一个新表,该表将根据两个表匹配的 id 添加第一个数据表的所有列加上 lastModifiedDate 列,如果这有意义的话?
  • 但是你能说明你的意思吗?我如何在每个单词后添加逗号?

标签: c# datatable


【解决方案1】:

您可能会使事情复杂化……看来您想混合所有这些表格的“组合”并将逗号全部添加到一个方法中……。而且我认为将这些函数分成一个简单的“克隆”方法和一个单独的简单“addCommas”方法会更容易。

添加逗号方法应该相当简单,可能如下所示,注意您可以将其减少到四行代码,但为了清楚起见,我使用了一些额外的变量......

string originalText;
string finalText;
string[] splitArray;
foreach (DataRow row in YourDataTable.Rows) {
  originalText = row["Language"].ToString();
  splitArray = originalText.Trim().Split(' ');
  finalText = string.Join(", ", splitArray);
  row["Language"] = finalText;
}

【讨论】:

  • 这正是我所需要的,谢谢。是的,我认为你是对的,过于复杂了。我一定会听取您的建议为此创建一个单独的方法。再次感谢您抽出宝贵时间提供帮助
猜你喜欢
  • 2010-10-18
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 2021-03-28
  • 2022-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多