尝试使用C#将行转换为列

时间:2018-07-06 12:36:36

标签: 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(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

1 个答案:

答案 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;
}