Попытка преобразовать строки в столбцы, используя C # - PullRequest
0 голосов
/ 06 июля 2018

Ниже мой код, который я использую

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
 **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 голосов
/ 06 июля 2018

Хорошо, вот что у меня есть, вам нужно будет проверить. Я полагаю, вам лучше конвертировать 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;
}
...