下面是我正在使用的代码
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;
}
以下是我从xml中获取的格式数据,该格式数据正转换为dataTable,如下所示:
dataTable
**Columnname value**
CANDIDATEID 3215456454454
Last Name demo1
Email demo1@gmail.com
Mobile 0000000
Experience in Years null
Current Employer null
CANDIDATEID 2515456564
Last Name demo2
Email test@gmail.com
Mobile 354564654
Experience in Years null
Current Employer null
我需要如下所示的输出:列名(对于示例,我仅在此处指定了一些列,我需要在数据表中获取的所有列)。
CandidateId Last Name Email Mobile etc
3215456454454 demo1 demo1@gmail.com 00000000
2515456564 demo2 test@gmail.com 354564654
答案 0 :(得分:0)
好,这就是我所拥有的,您需要进行测试。我认为最好将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;
}