【发布时间】: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 列,如果这有意义的话?
-
但是你能说明你的意思吗?我如何在每个单词后添加逗号?