PowerShell:从字符串中提取表

eltaco431

我有一个在PowerShell 2.0上运行的命令,该命令为我提供以下输出。

PowerShell输出

上面的屏幕截图中的所有内容都是一个巨大的字符串。我想拉出字符串的表部分,以便可以将其格式化为列表。最终,我希望输出如下所示:

INSTANCE_NAME: Sample Name
STATUS: MOUNTED
DATABASE_STATUS: ACTIVE

我首先想到的是使用正则表达式来抽出桌子。我以为这样的事情可能会奏效,但到目前为止我一直没有成功。

$tabletext = [regex]::match($rawtext, "(INSTANCE_NAME(.+\r\n)+)")

编辑:这是文本作为字符串。

SQL*Plus: Release 12.1.0.1.0 Production on Wed Apr 20 16:34:57 2016

Copyright (c) 1982, 2013, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL>
INSTANCE_NAME    STATUS       DATABASE_STATUS
---------------- ------------ -----------------
sample_name     OPEN         ACTIVE

SQL> Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
qbik

我做了一些非常类似于解析Firebird sql输出的操作。

这是一个对您的示例数据起作用的脚本:

function parse-headers($lines) {
   $h = $lines[0]

    $headers = $h.Split(" ", [System.StringSplitOptions]::RemoveEmptyEntries)
    $headers = $headers | %  { 
        new-object pscustomobject -property @{ 
            Length = $_.Length
            Offset = $h.IndexOf($_) 
            Text = $_ 
            }
    }     
    for($i = 1; $i -lt $headers.length; $i++) {
        $headers[$i-1].Length = $headers[$i].Offset - $headers[$i-1].Offset - 1
    }
    $headers[$header.length-1].Length = $h.length - $headers[$header.length-1].Offset

    return $headers
}

function parse-sqloutput($lines) {
    $headers = parse-headers $lines
    $result = @()

    for($l = 2; $l -lt $lines.Length; $l++) {
        $line = $lines[$l]
        $headernames = $headers | % { $h = @{} } { $h[$_.Text] = $null } { $h }
        $r = New-Object -type pscustomobject -Property $headernames
        for($i = 0; $i -lt $headers.length; $i++) {
            try {
                $h = $headers[$i]
                $name = $h.text
                if ($i -eq $headers.length - 1) {
                    $value = $line.Substring($h.Offset).Trim()
                }
                else {
                    $value = $line.Substring($h.Offset, $h.Length).Trim()
                }
                $r.$name = $value
            } catch {
                Write-Warning "failed to parse line $l col $i"
                throw    
            }
        }
        $result += $r
    }
    return $result
}

function get-sqltable($sqlout) {

    #find sql table output
    $startidx = -1
    $endidx = -1

    for($i = 0; $i -lt $sqlout.Length; $i++) {
        $line = $sqlout[$i]
        if ($line -match "^\s*([\-]+\s*)+$") { 
            $startidx = $i - 1 
        }
        if ($startidx -ge 0 -and $line -match "^\s*$") { 
            $endidx = $i 
        }
        if ($startidx -ge 0 -and $endidx -ge 0) { break }
    }

    $sqlout = $sqlout | select -Skip $startidx -First ($endidx-$startidx)
    return $sqlout
}

$sqlout = get-content "sqlout.txt" | out-string 

#split giant string into lines
$sqlout = $sqlout | Split-String "`r`n"
$sqlout = get-sqltable $sqlout

#we should now have only sql table in $sqlout
$result = parse-sqloutput $sqlout

$result | Format-List

这个想法是:

  1. 查找仅包含-字符字符串的行,并假定它标记了标题行。
  2. 在标题行之后查找第一个空行,并假定它是表输出的末尾。
  3. 解析标题行,获取列的名称和长度。
  4. 获取基于解析的列长度的值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章