2015-03-11 3 views
0

Это первый раз, когда я пишу функцию, которая может называть себя. Я пытаюсь удалить все столбцы DataTable, где строки пустые.PowerShell DataTable ошибочно удаляет пустую логику столбцов

Код работает нормально, но выплевывает некоторые ошибки. По той или иной причине он зацикливается в последний раз через цикл for со старым номером $Columns, который все еще находится в памяти. Хотя я его заполнение снова каждый раз, когда функция называется ... Я не понимаю, почему ..

Код:

Function Remove-EmptyColumns { 
    $Columns = $DataTable.Columns.Count 
    $Rows = $DataTable.Rows.Count 

    for ($c = 0; $c -lt $Columns; $c++) {  
     $Empty = 0  
     for ($r = 0; $r -lt $Rows; $r++) { 
      if ($DataTable.Rows[$r].Item($c).ToString() -eq '') { 
       $Empty++ 
      } 
     } 
     if ($Empty -eq $Rows) { 
      $DataTable.Columns.Remove($DataTable.Columns[$c]) 
      Remove-EmptyColumns 
     } 
    } 
} 

Спасибо за вашу помощь.

ответ

1

Почему это рекурсивный метод? Попробуйте удалить Remove-EmptyColumns, и он должен работать, нет?

EDIT: Попробуйте

Function Remove-EmptyColumns { 
    $Columns = $DataTable.Columns.Count 
    $Rows = $DataTable.Rows.Count 

    $columnsToRemove = @() 

    for ($c = 0; $c -lt $Columns; $c++) {  
     $Empty = 0  
     for ($r = 0; $r -lt $Rows; $r++) { 
      if ($DataTable.Rows[$r].Item($c).ToString() -eq '') { 
       $Empty++ 
      } 
     } 
     if ($Empty -eq $Rows) { 
      $columnsToRemove.Add($DataTable.Columns[$c]) 
     } 
    } 

    $columnsToRemove | ForEach-Object { 
      $DataTable.Columns.Remove($_) } 
} 
+0

Я думал, что, но это не работает. После удаления столбца номер идентификатора для других столбцов изменяется. – DarkLite1

+0

попробуйте отредактированный ответ – dustinmoris

+0

Ваше отредактированное предложение отлично работает, спасибо. Мне пришлось изменить его на '$ columnsToRemove + = $ DataTable.Columns [$ c]', так как это нормальный 'Array' по умолчанию, а не' ArrayList'. Это обходное решение отлично! Спасибо, должен был подумать об этом сам ...: P – DarkLite1

1

Только мысль, но мне нравится использовать струнный статический метод IsNullOrEmpty.

if ([string]::IsNullOrEmpty($DataTable.Rows[$r].Item($c).ToString())) 
{ ... } 

Это устраняет проблемы, при которых значение может не равняться '', но вместо этого должно быть $ Null, и оно выполняется в одной строке.

+0

Хорошее мышление, я должен чаще использовать ваше предложение. Я никогда не делаю этого на самом деле, потому что он выглядит так не-PowerShell-native, если это слово: D Спасибо за хедз-ап! – DarkLite1

Смежные вопросы