数据表中多个字段值用逗号分隔
Separate multiple field values with a comma in a datatable
在我的应用程序中,我有一个函数可以克隆原始数据table 并使用它来创建一个新数据并添加一个新列,如下所示:
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;
}
这很好用,但是,用于数据 table 的数据来自 sql 查询,有时在一行中的一个字段中,单个字段中会有多个值.例如,对于列语言,可能有一个字段具有以下值:English French German。我想做的是更改它,以便这些值用逗号分隔,我曾尝试做的是:
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());
}
但我意识到这不起作用,因为它也会影响所有其他列,所以我想知道如何更改它,以便这将仅影响指定列的字段,以便多个值由逗号?我是走在正确的轨道上还是走错了路?
编辑 -
所以基本上,在这一切结束时,最终数据 table 被导出到一个 csv 文件中,这是它目前的样子:
这就是我想要的样子:
我不确定这有多容易分辨,但在第一张图片中,您会看到对于列语言下的字段,当有多个单词时,它没有用逗号分隔是我希望它做的,如第二张图片所示
第二次编辑:
当我尝试以下操作时:
foreach (DataRow newRow in itemsTable.Rows)
{
object cellData = newRow["Language"];
string test = string.Join(",", cellData.ToString().ToArray());
Console.WriteLine(test);
}
它确实添加了一个逗号,但它是在每个字符之后而不是每个单词之后,所以我觉得我越来越接近了,但我仍然缺少一些东西
您可能会使事情复杂化……您似乎想混合所有这些表格的“组合”并将逗号 ALL 添加到一个方法中……。而且我认为将这些函数分成一个简单的“克隆”方法和一个单独的简单“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;
}
在我的应用程序中,我有一个函数可以克隆原始数据table 并使用它来创建一个新数据并添加一个新列,如下所示:
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;
}
这很好用,但是,用于数据 table 的数据来自 sql 查询,有时在一行中的一个字段中,单个字段中会有多个值.例如,对于列语言,可能有一个字段具有以下值:English French German。我想做的是更改它,以便这些值用逗号分隔,我曾尝试做的是:
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());
}
但我意识到这不起作用,因为它也会影响所有其他列,所以我想知道如何更改它,以便这将仅影响指定列的字段,以便多个值由逗号?我是走在正确的轨道上还是走错了路?
编辑 -
所以基本上,在这一切结束时,最终数据 table 被导出到一个 csv 文件中,这是它目前的样子:
这就是我想要的样子:
我不确定这有多容易分辨,但在第一张图片中,您会看到对于列语言下的字段,当有多个单词时,它没有用逗号分隔是我希望它做的,如第二张图片所示
第二次编辑:
当我尝试以下操作时:
foreach (DataRow newRow in itemsTable.Rows)
{
object cellData = newRow["Language"];
string test = string.Join(",", cellData.ToString().ToArray());
Console.WriteLine(test);
}
它确实添加了一个逗号,但它是在每个字符之后而不是每个单词之后,所以我觉得我越来越接近了,但我仍然缺少一些东西
您可能会使事情复杂化……您似乎想混合所有这些表格的“组合”并将逗号 ALL 添加到一个方法中……。而且我认为将这些函数分成一个简单的“克隆”方法和一个单独的简单“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;
}