C# 尝试使用C将行转换为列
下面是我正在使用的代码C# 尝试使用C将行转换为列,c#,asp.net,datatable,webforms,dataset,C#,Asp.net,Datatable,Webforms,Dataset,下面是我正在使用的代码 private DataTable GenerateTransposedTable(DataTable inputTable) { DataTable outputTable = new DataTable(); // Add columns by looping rows // Header row's first column is same as in inputTable outputTable.Columns.Add(inputT
private DataTable GenerateTransposedTable(DataTable inputTable)
{
DataTable outputTable = new DataTable();
// Add columns by looping rows
// Header row's first column is same as in inputTable
outputTable.Columns.Add(inputTable.Columns[0].ColumnName.ToString());
// Header row's second column onwards, 'inputTable's first column taken
foreach (DataRow inRow in inputTable.Rows)
{
string newColName = inRow[0].ToString();
DataColumnCollection columns = outputTable.Columns;
if (!columns.Contains(newColName))//code to check duplication of columns
{
outputTable.Columns.Add(newColName);
}
}
// Add rows by looping columns
for (int rCount = 1; rCount <= inputTable.Columns.Count - 1; rCount++)
{
DataRow newRow = outputTable.NewRow();
// First column is inputTable's Header row's second column
newRow[0] = inputTable.Columns[rCount].ColumnName.ToString();
for (int cCount = 0; cCount <= inputTable.Rows.Count - 1; cCount++)
{
string colValue = inputTable.Rows[cCount][rCount].ToString();
//int rowcount = cCount + 1;
//if (cCount <= rowcount)
//{
newRow[cCount + 1] = colValue; //**Error here when starts second record**
//}
}
outputTable.Rows.Add(newRow);
}
//for (int i = outputTable.Rows.Count - 1; i >= 0; i--)
for (int j = 0; j < outputTable.Columns.Count;j++)
{
for (int k = 0; k < outputTable.Rows.Count; k++)
{
string sdfsdf = outputTable.Rows[k][j].ToString();
if (outputTable.Rows[k][j].ToString() == "0")
{
DataRow dr = outputTable.Rows[k];
dr.Delete();
}
}
}
outputTable.AcceptChanges();
return outputTable;
}
我需要如下输出:示例的列名我在这里只指定了一些列,我需要在datatable中获得的所有列
CandidateId Last Name Email Mobile etc
3215456454454 demo1 demo1@gmail.com 00000000
2515456564 demo2 test@gmail.com 354564654
好的,这是我的,你需要测试一下。我认为最好将xml转换为对象,但这是另一个问题 这将适用于任何数据,因此,如果您的xml发生了更改,那么这仍然有效
public DataTable convertTable(DataTable inputTable, int columnNameIndex = 0, int columnValueIndex = 1)
{
var outputTable = new DataTable();
//Get the names of the columns for the output table
var columnNames = inputTable.AsEnumerable().Where(x => x[columnNameIndex] != DBNull.Value && x[columnValueIndex] != DBNull.Value)
.Select(x => x[columnNameIndex].ToString()).Distinct().ToList();
DataRow outputRow = outputTable.NewRow();
//create the columns in the output table
foreach (var columnName in columnNames)
{
outputTable.Columns.Add(new DataColumn(columnName));
}
//get all the rows in the input table
var totalRows = inputTable.Rows.Count;
//loop through the input table
for (int n = 0; n < totalRows; n++)
{
//loop through each columnname for each row
for (int i = 0; i < columnNames.Count; i++)
{
//if it's the first loop we need a new row
if (i == 0)
{
outputRow = outputTable.NewRow();
}
outputRow[columnNames[i]] = inputTable.Rows[n][columnValueIndex].ToString();
//^^get the corresponding value from the input table
//if it's the last loop all columns
//have values added so add the row to the input table
if (i == columnNames.Count - 1)
outputTable.Rows.Add(outputRow);
}
}
return outputTable;
}
列名是动态的吗?i、 e在第一个表最左边的列中?或者它们总是一样的?列名我从zoho recruit API中获得的XML字符串,我将其转换为datatable,当我转换为datatable时,我将获得以前的post格式,但我希望获得候选ID姓氏电子邮件手机3215456454454演示1demo1@gmail.com00000000 25154564演示2test@gmail.com354564654是的列名是动态的,在这种情况下,您不需要将其转换为datatable。你可以转换成一个对象,如果你愿意,我可以把它作为答案添加。我可以发布动态数据表答案和对象答案。给我点时间整理一下。安静的工作哈好谢谢你,我会检查并标记你作为确认后的答案@Sean TI进行了编辑-没有注意到将值放入输出表的行是条件ifi==0{}
public DataTable convertTable(DataTable inputTable, int columnNameIndex = 0, int columnValueIndex = 1)
{
var outputTable = new DataTable();
//Get the names of the columns for the output table
var columnNames = inputTable.AsEnumerable().Where(x => x[columnNameIndex] != DBNull.Value && x[columnValueIndex] != DBNull.Value)
.Select(x => x[columnNameIndex].ToString()).Distinct().ToList();
DataRow outputRow = outputTable.NewRow();
//create the columns in the output table
foreach (var columnName in columnNames)
{
outputTable.Columns.Add(new DataColumn(columnName));
}
//get all the rows in the input table
var totalRows = inputTable.Rows.Count;
//loop through the input table
for (int n = 0; n < totalRows; n++)
{
//loop through each columnname for each row
for (int i = 0; i < columnNames.Count; i++)
{
//if it's the first loop we need a new row
if (i == 0)
{
outputRow = outputTable.NewRow();
}
outputRow[columnNames[i]] = inputTable.Rows[n][columnValueIndex].ToString();
//^^get the corresponding value from the input table
//if it's the last loop all columns
//have values added so add the row to the input table
if (i == columnNames.Count - 1)
outputTable.Rows.Add(outputRow);
}
}
return outputTable;
}