当一个单词匹配时,检索它后面的变化字符串

时间:2018-04-24 14:37:20

标签: powershell loops foreach split match

我的查询如下:

FROM TableA 
INNER JOIN TableB
ON TableA.xx = TableB.xx
INNER JOIN TableC
ON TableA.yy = TableC.yy

我正在尝试编写一个脚本,用于选择“JOIN”一词之后的表格。

我现在写的脚本是:

$data = Get-Content -Path query1.txt
$dataconv = "$data".ToLower() -replace '\s+', ' '
$join = 0

$overigetabellen = ($dataconv) | foreach {
    if ($_ -match "join (.*)") {
        $join++
        $join = $matches[1].Split(" ")[0]  
        #Write-Host "Table(s) on which is joined:" $join"."
        $join
    }
}
$overigetabellen

这只给了我第一个表,所以TableB。 任何人都可以帮助我如何获得第二个表作为输出?

2 个答案:

答案 0 :(得分:2)

使用Select-String处理您的数据:

$data | Select-String -AllMatches -Pattern '(?<=join\s+)\S+' |
    Select-Object -Expand Matches |
    Select-Object -Expand Groups |
    Select-Object -Expand Value

(?<=...)是一个所谓的正向lookbehind断言,用于匹配模式而不包含在返回的字符串中(意味着返回的匹配只是在它们之前没有JOIN的表名)

答案 1 :(得分:1)

这是我寻找所需表名的天真尝试。

将空格上的数据输入拆分成数组,找到单词&#34; JOIN&#34;的索引,然后在单词&#34; JOIN之后访问以下索引。&#34;

$data = Get-Content -Path query1.txt
$indices = @()
$output = @()

$dataarray = $data -split '\s+'
$singleIndex = -1
Do{
    $singleIndex = [array]::IndexOf($dataarray,"JOIN",$singleIndex + 1)
    If($singleIndex -ge 0){$indices += $singleIndex}
}While($singleIndex -ge 0)

foreach ($index in $indices) {
$output += $dataarray[$index + 1]
}

输出:

  

表B

     

表C

如果您需要不同的输入文件,可以根据需要调整大小写(看到您将输入设置为全部小写)等。