Удалить DataRow в DataTable, который не содержит числовых значений - PullRequest
0 голосов
/ 14 октября 2019

Я хочу иметь возможность удалять DataRows в DataTable, которые содержат нулевые значения для массивов, не содержащих числовых данных.

Попытка изменить приведенный ниже код, который переносит DataTable для использования API визуализации Google:

private DataTable TransposeOpiate(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();
        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();
            newRow[cCount + 1] = colValue;
        }

        outputTable.Rows.Add(newRow);
    }

    return outputTable;
}

Например, в выводе intellisense, показанном ниже строки для улучшения, где значения после не содержат данных (обычно это числовые значения), вместо этого содержат пустые индексы:

enter image description here

Мне нужно иметь возможность удалить эти строки, если они имеют вышеуказанный формат, как я могу изменить свой код для выполнения этого?

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Почему бы не установить условие, которое препятствует добавлению строки, если все ячейки строки имеют нулевое значение?

if (newRow.ItemArray.Any(x => x != null))
{
    outputTable.Rows.Add(newRow);
}

Если вам также необходимо проверить столбцы, сделайте это прямо перед возвратом outputTable

for (int col = outputTable.Columns.Count - 1; col >= 0; col--)
{
    bool toDelete = true;

    for (int row = 0; row < outputTable.Rows.Count; row++)
    {
        if (outputTable.Rows[row][col] != null)
        {
            toDelete = false;
        }
    }

    if (toDelete)
    {
        outputTable.Columns.RemoveAt(col);
    }
 }
0 голосов
/ 14 октября 2019

Вы можете попробовать что-то вроде этого (комментарии в коде):

private void CheckColumns()
{
    //table which we want to check
    DataTable table = new DataTable();
    //add column definition - first column will be string, other two are int columns
    table.Columns.Add("string column", typeof(string));
    table.Columns.Add("int column 1", typeof(int));
    table.Columns.Add("int column 2", typeof(int));

    //add data - in this example rows "abc" and "ghi" are valid because they have at least one numeric column
    table.Rows.Add(new object[] { "abc", 1, 2 });
    table.Rows.Add(new object[] { "def", null, null });
    table.Rows.Add(new object[] { "ghi", null, 2 });
    table.Rows.Add(new object[] { "jkl", null, null });

    //filter rows in a way, using Linq, that rows are filtered where at least one column has numeric value
    var validRows = table.AsEnumerable().Where(r => r.ItemArray.Any(c => IsNumeric(c))).ToList();
}

//this is helper method that code will call for each value in each row
private bool IsNumeric(object value)
{
    int outputValue;
    return int.TryParse(value.ToString(), out outputValue);
}

Если у вас будут десятичные значения, тогда вам следует отменить decimal.TyrParse в методе IsNumeric.

Если вам необходимо убедиться, что все столбцы, кроме первого, имеют числовые значения, вы можете сделать это следующим образом (пропустить первое значение из каждой строки и проверить, являются ли все остальные значения числовыми) ...

var validRows = table.AsEnumerable().Where(r => r.ItemArray.Skip(1).All(c => IsNumeric(c))).ToList();

когда у вас есть эти «допустимые» строки, вы можете записать эти данные в другую таблицу или сделать все, что вам нужно с этими данными ...

Вместо .ToList() вы можете использовать.CopyToDataTable() метод, так что вы получите новый DataTable с этими «действительными» строками. Например:

DataTable newDataTable = table.AsEnumerable().Where(r => r.ItemArray.Skip(1).All(c => IsNumeric(c))).CopyToDataTable();
...