簡體   English   中英

PowerShell DataTable刪除空行

[英]PowerShell DataTable delete empty rows

使用Excel.Application對象時,我偶然發現了一些(DCOM)問題。 因此,我已經重寫了使用AccessDatabaseEngine_x64中可用的OleDbConnectionOleDbCommand對象讀取Excel文件的函數。 因此,不再需要在服務器上安裝MS Office,而且我認為它也更可靠。

它工作得很好,但是唯一缺少的是我似乎無法弄清楚如何從函數的輸出中刪除空行。 我知道可以通過使用$DataTable[0].Delete() ,但是我不知道如何確定完整的行是否為空。 因為它的大小可能會因輸入而異。

XLSX文件示例:

Name     | Sir name
Bob Lee  | Swagger
         |
Jake     | Thornton

在上面的示例中,我只希望輸出2條(或3行,具體取決於$Header開關),但是我不想在輸出中看到空白行。

我找到了另一種語言的解決方案 ,但無法將其翻譯為PowerShell。

編碼:

Function Import-Excel {
    [CmdletBinding()]
    Param (
        [parameter(Mandatory=$true,Position=0)]
        [ValidateScript({Test-Path $_ -PathType Leaf})]
        [String]$FileName, 
        [parameter(Mandatory=$true,Position=1)]
        [String]$WorksheetName,
        [Switch]$Header
    )

    Begin {
        # We can't read open XLSX-Files
        Copy-Item -LiteralPath $FileName -Destination $env:TEMP
    }

    Process {
        $OleDbConnection = New-Object 'System.Data.OleDb.OleDbConnection'
        $OleDbCommand    = New-Object 'System.Data.OleDb.OleDbCommand'
        $ConnString = 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source='
        $ConnString += "$env:TEMP\$(Split-Path $FileName -Leaf)"

        if ($header) {
            $ConnString += ';Extended Properties="Excel 12.0;HDR=YES;IMEX=1";'
        }
        else {
            $ConnString += ';Extended Properties="Excel 12.0;HDR=NO;IMEX=1";'
        }

        $OleDbConnection.ConnectionString = $ConnString
        $OleDbConnection.Open()

        $OleDbCommand.Connection = $OleDbConnection
        $OleDbCommand.CommandText = "SELECT * FROM [$WorksheetName$]"

        $OleDbAdapter = New-Object "System.Data.OleDb.OleDbDataAdapter"
        $OleDbAdapter.SelectCommand = $OleDbCommand

        $DataTable = New-Object "System.Data.DataTable"
        $OleDbAdapter.Fill($DataTable)

        $OleDbConnection.Close() 
        Write-Output $DataTable
    }
    End {
        Remove-Item "$env:TEMP\$(Split-Path $FileName -Leaf)"
    }
}

謝謝您的幫助。

同時為遇到相同問題的任何人找到了答案:

Function Import-Excel {
    [CmdletBinding()]
    Param (
        [parameter(Mandatory=$true,Position=0)]
        [ValidateScript({Test-Path -LiteralPath $_ -PathType Leaf})]
        [String]$FileName, 
        [parameter(Mandatory=$true,Position=1)]
        [String]$WorksheetName,
        [Switch]$Header
    )

    Begin {
        # We can't read open XLSX-Files
        Copy-Item -LiteralPath $FileName -Destination $env:TEMP
    }

    Process {
        $OleDbConnection = New-Object 'System.Data.OleDb.OleDbConnection'
        $OleDbCommand    = New-Object 'System.Data.OleDb.OleDbCommand'
        $OleDbAdapter    = New-Object 'System.Data.OleDb.OleDbDataAdapter'
        $DataTable       = New-Object 'System.Data.DataTable'

        $ConnString = 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source='
        $ConnString += "$env:TEMP\$(Split-Path $FileName -Leaf)"

        if ($header) {
            $ConnString += ';Extended Properties="Excel 12.0;HDR=YES;IMEX=1";'
        }
        else {
            $ConnString += ';Extended Properties="Excel 12.0;HDR=NO;IMEX=1";'
        }

        $OleDbConnection.ConnectionString = $ConnString
        $OleDbConnection.Open()

        $OleDbCommand.Connection = $OleDbConnection
        $OleDbCommand.CommandText = "SELECT * FROM [$WorksheetName$]"

        $OleDbAdapter.SelectCommand = $OleDbCommand
        $OleDbAdapter.Fill($DataTable)

        $OleDbConnection.Close()

        # Remove empty lines
        $Columns = $DataTable.Columns.Count
        $Rows    = $DataTable.Rows.Count

        for ($r = 0; $r -lt $Rows; $r++) {    
            $Empty = 0
             for ($c = 0; $c -lt $Columns; $c++) {

                if ($DataTable.Rows[$r].IsNull($c)) {
                    $Empty++
                }
             }
             if ($Empty -eq $Columns) {
                # Mark row for deletion:
                $DataTable.Rows[$r].Delete()
             }
        }
        # Delete marked rows:
        $DataTable.AcceptChanges()

        Write-Output $DataTable
    }

    End {
        Remove-Item "$env:TEMP\$(Split-Path $FileName -Leaf)"
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM